一、使用DOM方法来遍历一个文档
问题:从HTML文档中提取数据,并了解这个HTML文档的结构。
方法:将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。示例代码:
File input = new File("D:/tmp/test.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://www.mchweb.net/");
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
String link_href = link.attr("href");
String link_text = link.text();
System.out.println(link_href);
System.out.println(link_text);
}
说明:Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:
查找元素:
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key) (and related methods)
Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
Graph: parent(), children(), child(int index)
元素数据:
attr(String key) //获取属性attr(String key, String value)设置属性
attributes() //获取所有属性
id(), className() and classNames()
text() //获取文本内容
text(String value) //设置文本内容
html() //获取元素内HTML
html(String value) //设置元素内的HTML内容
outerHtml() //获取元素外HTML内容
data() //获取数据内容(例如:script和style标签)
tag() and tagName() //
操作HTML和文本:
append(String html), prepend(String html)
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName)
html(String value)
二、从元素中抽取属性、文本和HTML
问题:在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。
方法:
要取得一个属性的值,可以使用Node.attr(String key) 方法
对于一个元素中的文本,可以使用Element.text()方法
对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法
示例:
String html = "
An example link.
";Document doc = Jsoup.parse(html);// 解析HTML字符串返回一个Document实现
Element link = doc.select("a").first();// 查找第一个a元素
String text = doc.body().text(); // "An example link"//取得字符串中的文本
String link_href = link.attr("href"); // "http://example.com/"//取得链接地址
String link_text = link.text(); // "example""//取得链接地址中的文本
String link_outerHtml = link.outerHtml();// "example"
String link_innerH = link.html(); // "example"//取得链接内的html内容
说明:
上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用:
Element.id()
Element.tagName()
Element.className() and Element.hasClass(String className)
这些访问器方法都有相应的setter方法来更改数据。
参见:
Element和Elements集合类的参考文档
URLs处理
使用CSS选择器语法来查找元素
三、URL处理
问题:有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs。
方法:
在你解析文档时确保有指定base URI,然后
使用 abs: 属性前缀来取得包含base URI的绝对路径。代码如下:
Document doc = Jsoup.connect("http://www.mchweb.net").get();
Element link = doc.select("a").first();
String relHref = link.attr("href"); // == "/"
String absHref = link.attr("abs:href"); // "http://www.mchweb.net/"
说明:
在HTML元素中,URLs经常写成相对于文档位置的相对路径: .... 当你使用 Node.attr(String key) 方法来取得a元素的href属性时,它将直接返回在HTML源码中指定定的值。
假如你需要取得一个绝对路径,需要在属性名前加 abs: 前缀。这样就可以返回包含根路径的URL地址attr("abs:href")
因此,在解析HTML文档时,定义base URI非常重要。
如果你不想使用abs: 前缀,还有一个方法能够实现同样的功能 Node.absUrl(String key)。