抓取网页新闻( Java程序在解析中的应用场景的主要类层次结构)
优采云 发布时间: 2021-10-06 19:24抓取网页新闻(
Java程序在解析中的应用场景的主要类层次结构)
jsoup抓取网页+详解
Java程序在解析HTML文档的时候,相信大家都接触过开源项目htmlparser。我在 IBM DW 上发表了两篇关于 htmlparser 的文章。它们是:从 HTML 中获取您需要的信息并扩展 HTMLParser 处理自定义标签的能力。但是现在我不再使用htmlparser了,因为htmlparser很少更新,但最重要的是有jsoup。
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
jsoup的主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可以操作 HTML 元素、属性和文本;
jsoup是基于MIT协议发布的,可以放心用于商业项目。
jsoup的主类层次结构如图1所示:
图1.jsoup的类层次结构
接下来我们具体说明jsoup是如何针对几种常见的应用场景优雅地处理HTML文档的。
文件输入
jsoup 可以从字符串、URL 地址和本地文件中加载 HTML 文档,并生成 Document 对象实例。
这是相关的代码:
清单 1
// 直接从字符串中输入 HTML 文档
String html = " 开源中国社区 "
+ "<p> 这里是 jsoup 项目的相关文章 ";
Document doc = Jsoup.parse(html);
// 从 URL 直接加载 HTML 文档
Document doc = Jsoup.connect("http://www.oschina.net/").get();
String title = doc.title();
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
// 从文件中加载 HTML 文档
File input = new File("D:/test.html");
Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");
</p>
请注意最后一个 HTML 文档输入法中 parse 的第三个参数。为什么这里需要指定网址(虽然可以不指定,如第一种方法)?因为HTML文档中会有很多链接、图片、外部脚本、css文件等,而第三个参数baseURL的意思是当HTML文档使用相对路径来引用外部文件时,jsoup会自动将这些URL加上this基本网址。
例如,开源软件将转换为开源软件。
解析和提取 HTML 元素
这部分涉及到一个HTML解析器最基本的功能,但是jsoup使用了一种不同于其他开源项目的方法——选择器。我们将在上一部分详细介绍 jsoup 选择器。在本节中,您将看到 jsoup 是如何使用最简单的代码来实现的。
但是,jsoup 也提供了传统的 DOM 元素分析。看看下面的代码:
列表2.
File input = new File("D:/test.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
String linkHref = link.attr("href");
String linkText = link.text();
}
你可能觉得jsoup的方法很眼熟,没错,getElementById、getElementsByTag等方法和JavaScript方法同名,功能完全一样。您可以根据节点名称或 HTML 元素的 id 获取相应的元素或元素列表。
与 htmlparser 项目不同,jsoup 没有为 HTML 元素定义相应的类。通常,一个 HTML 元素的组成部分包括:节点名称、属性和文本。Jsoup 为您提供了一种简单的方法来自己检索这些数据。这也是 jsoup 保持苗条的原因。
在元素检索方面,jsoup的选择器是无所不能的。
列表3.
File input = new File("D:\test.html");
Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");
Elements links = doc.select("a[href]"); // 具有 href 属性的链接
Elements pngs = doc.select("img[src$=.png]");// 所有引用 png 图片的元素
Element masthead = doc.select("div.masthead").first();
// 找出定义了 class=masthead 的元素
Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
这就是 jsoup 真正说服我的地方。Jsoup 使用与 jQuery 相同的选择器来检索元素。如果上面的检索方式换成另外一个HTML解释器,至少需要多行代码,而jsoup只需要一行代码。完成。
jsoup 的选择器也支持表达式功能,我们将在上一节介绍这个超级选择器。
更改数据
在解析文档时,我们可能需要修改文档中的一些元素。例如,我们可以为文档中的所有图像添加可点击的链接、修改链接地址或修改文本。
下面是一些简单的例子:
列表4.
doc.select("div.comments a").attr("rel", "nofollow");
// 为所有链接增加 rel=nofollow 属性
doc.select("div.comments a").addClass("mylinkclass");
// 为所有链接增加 class=mylinkclass 属性
doc.select("img").removeAttr(" // 删除所有图片的 onclick 属性
doc.select("input[type=text]").val(""); // 清空所有文本输入框中的文本
原因很简单,只需要使用jsoup的selector来查找元素,然后通过上面的方法修改即可,除了不能修改标签名(可以删除插入新元素) ,包括元素的属性和文本 可以修改。
修改后,直接调用Element(s)的html()方法得到修改后的HTML文档。
HTML 文档清理
jsoup 在提供强大 API 的同时,在用户友好性方面也非常出色。在做网站的时候,经常会提供用户评论功能。有些用户比较调皮,会在评论内容中加入一些脚本,这些脚本可能会破坏整个页面的行为,更严重的是获取一些机密信息,比如XSS跨站攻击。
jsoup 对这方面的支持非常强大,使用起来也非常简单。看看下面的一段代码:
列表5.
<p>
String unsafe = "<p>