Jsoup简介
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Demo演示
需求: 爬取携程故宫景点信息
链接: 【携程攻略】故宫门票,北京故宫攻略/地址/图片/门票价格
爬取位置:
html代码:
<pre style="margin: 8px 0px;"><ul class="s_sight_in_list">
<li>
<span class="s_sight_classic">等 级:</span>
<span class="s_sight_con">AAAAA</span>
</li>
<li>
<span class="s_sight_classic">电 话:</span>
<span class="s_sight_con">010-85007938</span>
</li>
<li>
<span class="s_sight_classic">官方网站:</span>
<span class="s_sight_con">
<a rel="nofollow" class="breakurl" href="http://www.dpm.org.cn/Home.html" target="_blank">http://www.dpm.org.cn/Home.html</a>
</span>
</li>
</ul></pre>
爬虫代码:
@Test
public void func1() throws IOException {
String url = "http://you.ctrip.com/sight/beijing1/229.html";
Connection con = Jsoup.connect(url).timeout(30000);
// 设置用户代理
con.userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36");
Document doc = con.get();
// 景点简介部分
Element select = doc.selectFirst(".s_sight_in_list");
System.out.println(select.text());
}
爬取效果:
设计好表格就可以入库了。
Jsoup选择器
选择器对象由org.jsoup.nodes.Document
、org.jsoup.nodes.Element
、org.jsoup.select.Elements
组成, 其中Element是核心类
public class Document extends Element
public class Elements extends ArrayList<Element>
public class Element extends Node
一个HTML元素(Element)由一个标签、若干属性、若干子节点(子节点包括文本节点和其它标签节点)组成。从Element的实例中, 你可以提取数据, 遍历节点图和修改当前元素
元素筛选
- 查找元素
getElementById(String id): 通过id获取元素
getElementsByTag(String tag): 通过标签名获取元素
getElementsByClass(String className): 通过标签class属性获取元素
getElementsByAttribute(String key) (and related methods): 通过标签属性获取元素
Element siblings:
siblingElements(): 全部同级元素
firstElementSibling(): 第一个同级元素
lastElementSibling(): 最后一个同级元素
nextElementSibling(): 下一个同级元素
previousElementSibling(): 前一个同级元素
Graph:
parent(): 父级元素
children(): 子级元素
child(int index): 第几个子级元素
选择器更加详尽的使用方式请参考参考1
- 元素数据
attr(String key): 获取属性
attr(String key, String value): 设置属性
attributes(): 获取所有属性
id(): 获取当前元素的id属性
className(): 获取当前元素所有的class属性的字符串
classNames(): 获取当前元素所有的class属性的数组
text(): 获取文本内容
text(String value): 设置文本内容
html(): 获取元素内HTML
html(String value): 设置元素内的HTML内容
outerHtml(): 获取元素外HTML内容
data(): 获取数据内容(例如:script和style标签)
tag(): 获取当前标签对象
tagName(): 获取当前标签名
- 操作HTML和文本
append(String html): 将html文本添加到当前元素内, 在添加前会被解析, 再把解析出的每个节点添加到当前元素的子节点最后面
prepend(String html): 将html文本添加到当前元素内, 在添加前会被解析, 再把解析出的每个节点添加到当前元素的子节点最前面
appendText(String text): 创建并添加一个新的文本节点到当前元素子节点的后面
prependText(String text): 创建并添加一个新的文本节点到当前元素的子节点的前面
appendElement(String tagName): 通过标签名创建一个元素, 并添加到当前元素子节点的后面
prependElement(String tagName): 通过标签名创建一个元素, 并添加到当前元素子节点的前面
html(String value): 当前元素内如果存在节点则清除, 在设置html内容
实践
-
获取照片的链接
缩略图链接获取
@Test
public void func3() throws IOException {
String url = "http://you.ctrip.com/sight/beijing1/229.html";
Connection con = Jsoup.connect(url).timeout(30000);
// 设置用户代理
con.userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36");
Document doc = con.get();
Element imgTag = doc.selectFirst("div.s_sight_map img");
String src = imgTag.attr("src");
System.out.println("照片的链接: " + src);
}
效果
-
获取标签文本
只获取"条点评"文本
<dfn id="hrefyyDp"><span class="f_orange">55994</span>条点评</dfn>
@Test
public void func3() throws IOException {
String url = "http://you.ctrip.com/sight/beijing1/229.html";
Connection con = Jsoup.connect(url).timeout(30000);
// 设置用户代理
con.userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36");
Document doc = con.get();
Element imgTag = doc.selectFirst("#hrefyyDp");
String text = imgTag.ownText();
System.out.println(text);
}
效果
网友评论