今天给大家介绍一款强大的,方便的,基于Java的Html parser — Jsoup。相比于大家熟悉的HtmlParser,Jsoup显得更强大,更易用。如果你使用过Jquery的选择器,那么当你使用Jsoup时,你会感到是那么的亲切…
Jsoup是一个方便于操作HTML的开源的java类库,基于MIT协议发布。其提供的API能够非常方便的从HTML中提出和处理数据,对HTML DOM的操作提供了类似于JQuery的方法。
解析来,我们实际看看Jsoup是怎么对HTML进行遍历和解析的吧。
解析出Document
1
2
3
|
String html =
"<html><head><title>First parse</title></head>"
+
"<body><p>Parsed HTML into a doc.</p></body></html>"
;
Document doc = Jsoup.parse(html);
|
其返回的Document对象就是Jsoup定义的文档模型,包含了Elements和TextNodes.当然Document也可以认为是一个特殊的Element,因为其本身就是继承自Element.
解析HTML片段
当你有一段HTML片段需要解析,例如一个DIV包含着多个P元素,那么你可以使用下面的方法:
1
2
3
|
String html =
"<div><p>Lorem ipsum.</p>"
;
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
|
上面的doc其实对应:
1
|
<
html
> <
head
></
head
> <
body
> <
div
> <
p
>Lorem ipsum.</
p
> </
div
> </
body
></
html
>
|
body为:
1
|
<body> <div> <p>Lorem ipsum.</p> </div></body>
|
从一个URL装载一个Document
你能够方便的从一个web页面获取并解析其HTML,参考代码:
1
2
|
String title = doc.title();
|
connect(String url)方法创建了一个Connection对象,get()方法获取并解析html文档。
Connection接口还提供了下面一些方法:
1
2
3
4
5
6
|
.data(
"query"
,
"Java"
)
.userAgent(
"Mozilla"
)
.cookie(
"auth"
,
"token"
)
.timeout(
3000
)
.post();
|
从一个文件装载Document
你可以从本地文件加载并解析HTML,参考代码:
1
2
|
File input =
new
File(
"/tmp/input.html"
);
|
parse(File in, String charsetName, String baseUri) 会抛出IOException。baseUri参数是用来在解析html过程中,如果遇到相对路径的链接时,能够加上去成为绝对路径。
使用提供的DOM操作方法浏览Document
废话不说,看代码:
1
2
3
4
5
6
7
8
9
|
File input =
new
File(
"/tmp/input.html"
);
Element content = doc.getElementById(
"content"
);
Elements links = content.getElementsByTag(
"a"
);
for
(Element link : links) {
String linkHref = link.attr(
"href"
);
String linkText = link.text();
}
|
很清楚吧,是不是很像JS?
总结一下Jsoup提供的方法:
获取元素的有:
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key)
siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
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()
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)
使用选择器语法来获取元素
如果你用过jQuery,这一段代码你绝对不会陌生:
1
2
3
4
5
6
7
8
9
10
11
|
File input =
new
File(
"/tmp/input.html"
);
Elements links = doc.select(
"a[href]"
);
// a with href
Elements pngs = doc.select(
"img[src$=.png]"
);
// img with src ending .png
Element masthead = doc.select(
"div.masthead"
).first();
// div with class=masthead
Elements resultLinks = doc.select(
"h3.r > a"
);
// direct a after h3
|
Jsoup支持的选择器一览:
tagname: 根据tabname获取元素
ns|tag: ns为命名空间下面选择tagname为tag的元素
#id: 根据ID获取元素
.class: 根据class获取元素
[attribute]: 根据指定的属性获取元素
[^attr]: 根据以attr开头的属性获取元素
[attr=value]: 指定属性值的元素
[attr=~regex]: 根据属性值匹配正则表达式获取元素
*: 匹配所以元素
当然,选择器还可以混合使用:
el#id:
el.class:
el[attr]:
ancestor child:
parent > child:
siblingA + siblingB:
siblingA ~ siblingX:
el, el, el:
还有伪选择器:
el:lt(n):
el:gt(n):
el:eq(n):
el:has(seletor):
el:contains(text):
el:containsOwn(text):
el:matches(regex):
el:matchesOwn(regex):
当然,Jsoup还有一些没总结到的方法,下次再记录吧。