网页flash文本抓取器( Java程序在解析中的应用场景的主要功能详解)
优采云 发布时间: 2022-02-15 22:21网页flash文本抓取器(
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>