Java爬⾍系列三:使⽤Jsoup解析HTML
在上⼀篇随笔《Java爬⾍系列⼆:使⽤HttpClient抓取页⾯HTML》中介绍了怎么使⽤HttpClient进⾏爬⾍的第⼀步--抓取页⾯html,今天接着来看下爬⾍的第⼆步--解析抓取到的html。
有请第⼆步的主⾓:Jsoup粉墨登场。
⼀、Jsoup⾃我介绍
⼤家好,我是Jsoup。
我是⼀款Java 的HTML解析器,可直接解析某个URL地址、HTML⽂本内容。它提供了⼀套⾮常省⼒的API,可通过DOM,CSS以及类似于jQuery的操作⽅法来取出和操作数据,⽤Java写爬⾍的同⾏们⼗之⼋九⽤过我。为什么呢?因为我在这个⽅⾯功能强⼤、使⽤⽅便。不信的话,可以继续往下看,代码是不会骗⼈的。
⼆、Jsoup解析html
上⼀篇中,HttpClient⼤哥已经抓取到了博客园⾸页的html,但是⼀堆的代码,不是程序员的⼈们怎么能看懂呢?这个就需要html解析专家出场了。
下⾯通过案例展⽰如何使⽤Jsoup进⾏解析,案例中将获取博客园⾸页的标题和第⼀页的博客⽂章列表
请看代码(在上⼀篇代码的基础上进⾏操作,如果还不知道如何使⽤httpclient的朋友请跳转页⾯进⾏阅读):
引⼊依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
实现代码。实现代码之前⾸先要分析下html结构。标题是<title>不⽤说了,那⽂章列表呢?按下浏览器的F12,查看页⾯元素源码,你会发现列表是⼀个⼤的div,id="post_list",每篇⽂章是⼩的div,class="post_item"
接下来就可以开始代码了,Jsoup核⼼代码如下:
/**
* 下⾯是Jsoup展现⾃我的平台
*/
//6.Jsoup解析html
Document document = Jsoup.parse(html);
//像js⼀样,通过标签获取title
System.out.ElementsByTag("title").first());
//像js⼀样,通过id 获取⽂章列表元素对象
Element postList = ElementById("post_list");
//像js⼀样,通过class 获取列表下的所有博客
Elements postItems = ElementsByClass("post_item");
//循环处理每篇博客
for (Element postItem : postItems) {
//像jquery选择器⼀样,获取⽂章标题元素
Elements titleEle = postItem.select(".post_item_body a[class='titlelnk']");
System.out.println("⽂章标题:" + ());;
System.out.println("⽂章地址:" + titleEle.attr("href"));
//像jquery选择器⼀样,获取⽂章作者元素
Elements footEle = postItem.select(".post_item_foot a[class='lightblue']");
System.out.println("⽂章作者:" + ());;
System.out.println("作者主页:" + footEle.attr("href"));
System.out.println("*********************************");
}
根据以上代码你会发现,我通过Jsoup.parse(String html)⽅法对httpclient获取到的html内容进⾏解析获取到Document,然后document可以有两种⽅式获取其⼦元素:像js⼀样 可以通过getElementXXXX的⽅式 和 像jquery 选择器⼀样通过select()⽅法。 ⽆论哪种⽅法都可以,我个⼈推
荐⽤select⽅法处理。对于元素中的属性,⽐如超链接地址,可以使⽤element.attr(String)⽅法获取, 对于元素的⽂本内容通过()⽅法获取。
执⾏代码,查看结果(不得不感慨博客园的园友们真是太厉害了,从上⾯分析⾸页html结构到Jsoup分析的代码执⾏完,这段时间⾸页多了那么多⽂章)
三、Jsoup的其他⽤法
我,Jsoup,除了可以在httpclient⼤哥的⼯作成果上发挥作⽤,我还能⾃⼰独⽴⼲活,⾃⼰抓取页⾯,然后⾃⼰分析。分析的本领已经在上⾯展⽰过了,下⾯来展⽰⾃⼰抓取页⾯,其实很简单,所不同的是我直接获取到的是document,不⽤再通过Jsoup.parse()⽅法进⾏解析了。
除了能直接访问⽹上的资源,我还能解析本地资源:
代码:
public static void main(String[] args) {
try {
Document document = Jsoup.parse(new File("d://1.html"), "utf-8");
System.out.println(document);
} catch (IOException e) {
e.printStackTrace();
}
}
四、Jsoup另⼀个值得⼀提的功能
你肯定有过这种经历,在你的页⾯⽂本框中,如果输⼊html元素的话,保存后再查看很⼤概率会导致页⾯排版乱七⼋糟,如果能对这些内容进⾏过滤的话,就完美了。
如何查看html代码刚好我Jsoup就能做到。
public static void main(String[] args) {
String unsafe = "<p><a href='⽹址' onclick='stealCookies()'>博客园</a></p>";
System.out.println("unsafe: " + unsafe);
String safe = Jsoup.clean(unsafe, Whitelist.basic());
System.out.println("safe: " + safe);
}
通过Jsoup.clean⽅法,⽤⼀个⽩名单进⾏过滤。执⾏结果:
unsafe: <p><a href='⽹址' onclick='stealCookies()'>博客园</a></p>
safe: <p><a rel="nofollow">博客园</a></p>
五、结束语
不仅可以解析HttpClient抓取到的html元素,⾃⼰也能抓取页⾯dom,还能load并解析本地保存的html⽂件。
此外,还能通过⼀个⽩名单对字符串进⾏过滤,筛掉⼀些不安全的字符。
最最重要的,上⾯所有功能的API的调⽤都⽐较简单。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。