抓取网页新闻( 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>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线