jquery抓取网页内容( Java程序在解析中的应用场景的主要类层次结构)
优采云 发布时间: 2022-03-26 05:14jquery抓取网页内容(
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的第三个参数。为什么这里需要指定一个URL(虽然不能指定,比如第一种方法)?因为HTML文档中有很多链接、图片和外部脚本、css文件等,第三个名为baseURL的参数表示当HTML文档使用相对路径引用外部文件时,jsoup会自动将这些URL以 baseURL 为前缀。
例如,将开源软件转换为开源软件。
解析和提取 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的选择器找到元素,然后就可以通过上面的方法进行修改,只是标签名不能修改(可以删除后再插入新元素),包括可以修改元素的属性和文本。
修改后,直接调用Element(s)的html()方法获取修改后的HTML文档。
HTML 文档清理
jsoup 提供了强大的 API 的同时,也非常人性化。在做网站的时候,往往会提供用户评论的功能。有些用户调皮,会在评论内容中添加一些脚本,这些脚本可能会破坏整个页面的行为,更严重的是会获取一些机密信息,比如XSS跨站攻击等。
jsoup 对此的支持非常强大,使用起来也非常简单。看看下面的代码:
列表5.
<p>
String unsafe = "<p>