Retrofit中Jsoup解析html(一)
简介
Jsoup 是一个Java库,用于解析HTML文档和提取所需的数据。它提供了一种非常方便的方式来处理实际网页上的数据抓取、解析和操作。Jsoup能够将复杂的HTML文档转换成一个可操作的DOM(文档对象模型)树结构,使得开发者可以使用类似于jQuery的选择器语法来定位和提取文档中的元素。本章主讲Document类。
Document 类是Jsoup库中的一个核心类,它代表了一个完整的HTML文档。当你使用Jsoup解析一个HTML字符串、URL或文件时,你会得到一个Document对象。这个对象允许你以面向对象的方式遍历和操作HTML文档中的各个部分,包括元素(如<div>、<a>)、属性(如class、id)以及文本内容。
一、response.body()获取内容
String html = response.body();
从Retrofit的响应对象(response)中提取HTML内容。response.body()方法返回的是HTTP响应的主体部分,这里假设它是一个HTML字符串。
![]()
二、Jsoup库解析HTML字符串
Document doc = Jsoup.parse(html);
这里使用了Jsoup库来解析HTML字符串。Jsoup.parse(html)方法接收一个HTML字符串作为参数,然后将其解析成一个Document对象。Document对象就像是一个代表整个HTML文档的根节点,你可以通过它来访问和操作文档中的所有元素。
![]()
三、Document的text()方法纯文本内容
String description = doc.text();
通过调用doc.text()方法,提取了整个HTML文档的纯文本内容。这意味着它会去除所有HTML标签,只保留文本数据。如果你的目标是提取特定的文本(比如某个标签内的文本或<meta>标签的描述信息),直接使用doc.text()可能不是最佳选择,因为它会合并文档中的所有可见文本。对于提取特定的meta描述,应使用类似doc.select("meta[name=description]").attr("content")的方法,如之前讨论的。
![]()
效果:

四、Document的title()方法标题
String ht = doc.title();
通过Jsoup的parse()方法解析HTML字符串后,可以直接调用title()方法获取<title>标签的文本内容。
![]()
效果:

五、根据id选择元素
String id = doc.getElementById("header").text();
getElementById("header"): 这个方法用于从doc所代表的HTML文档中,根据指定的ID选择一个元素。在这里,"header"是作为参数传递的ID。这意味着它会查找文档中ID属性值为header的第一个元素。ID在HTML文档中应该是唯一的,所以这个方法应该只返回一个元素,但如果存在多个相同ID的情况(虽然不符合规范),Jsoup会返回第一个匹配的元素。
.text(): 调用.text()方法是用于获取所选元素的纯文本内容。这将提取元素及其所有子元素中的文本,忽略HTML标签,把它们合并成一个无格式的字符串。换句话说,它提取的是用户在浏览器中能看到的文本部分,而不会包括任何HTML结构。
![]()
![]()
<nav >这里所有的文本数据均会被提取 </nav>
效果:

六、根据标签tag
String tag = doc.getElementsByTag("td").text();
getElementsByTag("td"): 这个方法用于从doc中选择所有具有指定标签名的元素。在这里,传入的参数是"td",意味着它会查找文档中的所有<td>标签。getElementsByTag返回的是一个Elements集合,这个集合包含了文档中所有匹配该标签的元素。
.text(): 当你调用一个Elements集合的.text()方法时,Jsoup会合并该集合中所有元素的纯文本内容,忽略HTML标签,将它们连接起来形成一个单一的字符串。这意味着如果集合中有多个<td>标签,.text()会提取每个<td>标签中的文本,并将这些文本串在一起,中间没有明显的分隔符(除非文本本身包含换行或空格)。

![]()
效果:

String tag = doc.getElementsByTag("td").text();这行代码的意图是从整个HTML文档中找出所有<td>标签,并将这些标签中的文本内容合并成一个字符串,然后将这个字符串赋值给变量tag。然而,需要注意的是,如果文档中包含多个<td>元素,这种方法可能不会按照预期工作,因为它会将所有<td>内的文本合并到一起,可能导致信息混淆。如果需要分别处理每个<td>的文本,你应该遍历Elements集合,单独处理每个元素。
get()Elements集合位号获取:
String tag2 = doc.getElementsByTag("td").get(0).text();
doc: 这仍然是一个通过Jsoup解析得到的HTML文档对象,包含了文档的全部结构和内容。
getElementsByTag("td"): 此方法查找文档中所有<td>标签的元素,并返回一个Elements集合,其中包含了所有匹配到的<td>元素。
.get(0): 这里是对前面获取到的Elements集合进行操作,通过指定索引0来获取集合中的第一个元素。在Java的集合中,索引是从0开始的,因此get(0)就是获取第一个<td>标签元素。
.text(): 最后,对选中的第一个<td>标签元素调用.text()方法,来提取该元素内部的纯文本内容,忽略所有HTML标签。
![]()
![]()

