1、jsoup简介
jsoup 是一款 Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。jsoup 的主要功能如下:
(1)从一个 URL,文件或字符串中解析HTML;
(2)使用DOM或CSS选择器来查找、取出数据;
(3)可操作HTML元素、属性、文本;
2、maven配置
<dependency>
<groupId>org.jsoupgroupId>
<artifactId>jsoupartifactId>
<version>1.7.3version>
dependency>
3、解析一个HTML文档
3.1 从字符串解析
String html = "<html><head><title>First parsetitle>head>" + "<body><p>Parsed HTML into a doc.p>body>html>";
Document doc = Jsoup.parse(html);
3.2 从URL获取解析
Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();
(1)说明
connect(String url)方法创建一个新的 Connection, 和get()取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。Connection 接口还提供一个方法链来解决特殊请求,具体如下:
Document doc = Jsoup.connect("http://www.oschina.net/")
.data("query", "Java") // 请求参数
.userAgent("I ’ m jsoup") // 设置 User-Agent
.cookie("auth", "token") // 设置 cookie
.timeout(3000) // 设置连接超时时间
.post(); // 使用 POST 方法访问 URL
这个方法只支持Web URLs (http和https 协议); 假如你需要从一个文件加载,可以使用parse(File in, String charsetName) 代替。
3.3 从文件解析
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");
(1)说明
parse的第三个参数,需要在这里指定一个网址(虽然可以不指定),因为HTML文档中会有很多例如链接、图片以及所引用的外部脚本、css 文件等,而第三个名为 baseURL 的参数的意思就是当 HTML 文档使用相对路径方式引用外部文件时,jsoup 会自动为这些 URL 加上一个前缀,也就是这个 baseURL。
例如 : 开源软件
会被转换成 开源软件
。
4、遍历一个HTML文档
4.1 Document方式遍历元素
4.1.1 搜索元素方法
getElementById(String id)
getElementByTag(String tag)
getElementByClass(String className)
getElementByAttribute(String key)
siblingElements(), firstElementSibling(), lastElementSibling(), nextElementSibling(), previousElementSibling()
parent(), children(), child(int index)
4.1.2 获取元素数据
attr(String key) – 获取key属性
attributes() – 获取属性
id(), className(), classNames()
text() – 获取文本内容
html() – 获取元素内部HTML内容
outerHtml() – 获取包括此元素的HTML内容
data() – 获取<srcipt>或<style>标签中的内容
tag(), tagName()
4.2 选择器语法遍历元素(jsoup与其他解析器的区别就是可以使用类似jquery的选择器语法来搜索及过滤出所需的元素)
4.2.1 基本选择器
tagname: 搜索tag标签的元素
ns|tag: 搜索命名空间内tag标签的元素,如fb|name:<fb:name>
id: 搜索有指定id的元素
.class: 搜索有指定class的元素
[attribute]: 搜索有attrribute属性的元素
[^attri]: 搜索有以attri开头的属性的元素
[attr=value]: 搜索有指定属性及其属性值的元素
[attr^=value], [attr$=value], [attr*=value]: 搜索有指定attr属性,且其属性值是以value开头、结尾或包括value的元素,如[href*=/path/]
[attr~=regex]: 搜索有指定attr属性,且其属性值符合regex正则表达式的元素
*: 搜索所有元素
4.2.2 选择器组合
el#id: 同时指定标签名称和id
el.class: 同时指定标签名称和class
el[attr]: 同时指定标签名称和及其中所含属性的名称
上述3项的任意组合,如a[href].highlight
ancestor child: 包含,如div.content p,即搜索<div class=”content”>下含有标签的元素
ancestor > child: 直接包含,如div.content > p,即搜索直属<div class="content">节点下的
标签元素;div.content > *,即搜索<div class="content">下的所有元素
siblingA + siblingB: 直接遍历,如div.head + div,即搜索<div class="head"><div>的元素,其中不再包含子元素
siblingA ~ siblingX: 遍历,如h1 ~ p,即
下直接或间接有
的元素
el, el, el: 组合多个选择器,搜索满足其中一个选择器的元素
5、使用范例
/*
previousSibling()获取某标签前面的代码
nextSibling()获取某标签后的代码
如:
*/
Elements items = doc.select("form[id=form1]");
Elements prevs = items.select("br");
for(Element p : prevs){
String prevStr = p.previousSibling().toString().trim());
}
/*
最常用的链接抓取
*/
String itemTag = "div[class=mydiv]";
String linkTag = "a"
Elements items = doc.select(itemTag);
Elements links = items.select(linkTag);
for(Element l : links){
String href = l.attr("abs:href");//完整Href
String absHref = l.attr("href");//相对路径
String text = l.text();
String title = l.attr("title");
}