解析和遍历一个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 attributesattributes()
to get all attributesid()
,className()
andclassNames()
text()
to get andtext(String value)
to set the text contenthtml()
to get andhtml(String value)
to set the inner HTML contentouterHtml()
to get the outer HTML valuedata()
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(使用选择器语法,参考)