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标签。