解析和遍历一个HTML文档
如何解析一个HTML文档:
String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
(更详细内容可查看 解析一个HTML字符串.)
其解析器能够尽最大可能从你提供的HTML文档来创见一个干净的解析结果,无论HTML的格式是否完整。比如它可以处理:
- 没有关闭的标签 (比如:
<p>Lorem <p>Ipsum
parses to<p>Lorem</p> <p>Ipsum</p>
) - 隐式标签 (比如. 它可以自动将
<td>Table data</td>
包装成<table><tr><td>?
) - 创建可靠的文档结构(html标签包含head 和 body,在head只出现恰当的元素)
一个文档的对象模型
- 文档由多个Elements和TextNodes组成 (以及其它辅助nodes:详细可查看:nodes package tree).
- 其继承结构如下:
Document
继承Element
继承Node
.TextNode
继承Node
. - 一个Element包含一个子节点集合,并拥有一个父Element。他们还提供了一个唯一的子元素过滤列表。
数据抽取
你有一个HTML文档,你想从中提取数据。而且你知道一般的HTML文档的结构。可用类似dom方法解析HTML文档。
1 /** 2 * 获取htmlElement元素 3 * @author bling 4 * @throws IOException 5 * @create Date:2014-07-13 6 */ 7 @Test 8 public void getDataElement() throws IOException{ 9 File input = new File("tmp/input.html"); 10 Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/"); 11 12 Element content = doc.getElementById("content"); 13 Elements links = content.getElementsByTag("a"); 14 for(Element link : links){ 15 String linkHref = link.attr("href"); 16 String linkText = link.text(); 17 System.out.println("linkHref:"+linkHref+"------"+"linkText:"+linkText); 18 } 19 }
Elements 提供类似查找Element的方法,并可提取操作数据,DOM对象为上下文:根据父亲Document查找匹配之下的document,并根据找到的document查找其下的孩子元素,使用这种方式可查找你想要的数据。
- 获取Elements的方法
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)
- 获取Element数据的方法
-
attr(String key)
to get andattr(String key, String value)
to set attributes -
attributes()
to get all attributes -
id()
,className()
andclassNames()
-
text()
to get andtext(String value)
to set the text content -
html()
to get andhtml(String value)
to set the inner HTML content -
outerHtml()
to get the outer HTML value -
data()
to get data content (e.g. ofscript
andstyle
tags) -
tag()
andtagName()
- 操作html和text的方法
-
append(String html)
,prepend(String html)
-
appendText(String text)
,prependText(String text)
-
appendElement(String tagName)
,prependElement(String tagName)
html(String value)
- 数据抽取:Selector syntax(使用选择器语法,参考)