JavaRush /Java 博客 /Random-ZH /使用 jsoup 轻松解析 HTML
Stanislav
第 21 级
Москва

使用 jsoup 轻松解析 HTML

已在 Random-ZH 群组中发布
也许有一天您需要从应用程序中的网站或 HTML 文档获取信息,我会毫不夸张地说,使用 jsoup 库将大大简化您的任务。 根据wiki,jsoup 是一个开源 Java 库,旨在解析、提取和操作 HTML 文档中存储的数据。

快速启动

该库可以作为 jar 文件下载并放置在项目中,或使用 Maven/Gradle 连接。我会在文章末尾留下一个官方网站的链接:在那里你可以找到该库的当前版本。在示例中,我们将通过 Maven 使用连接。让我们添加一个依赖项:
<​dependency​>
  <​groupId>org.jsoup</groupId>
  <​artifactId>jsoup</artifactId>
  <​version>1.11.3</version>
</dependency>

用法

首先,您需要Document从 org.jsoup.nodes.Document 获取该类的实例,指示解析的源。它可以是本地文件或链接。例如,在本文中,我们将使用网站 yandex.ru 并尝试获取他们当前的新闻源:
Document doc = Jsoup.connect("https://yandex.ru/")
                .userAgent("Chrome/4.0.249.0 Safari/532.5")
                .referrer("http://www.google.com")
                .get();
User Agent是传送到正在访问的站点的标识符。在许多网站上,它是反垃圾邮件过滤器最重要的标准。 Referrer包含请求源的 URL。该方法get()抛出一个已处理的 IOException,因此我们可以将所有内容包装在try/catch一个块中,或者只是使用 进一步抛出它throws。我们现在已经收到了该页面的源代码。如果需要,jsoup 库本身可以恢复损坏的元素。现在我们要做的就是将搜索范围缩小到一个单独的块。该方法select()有多种用途:它允许您通过标签、属性、类和其他参数来搜索元素。几乎所有现代浏览器都支持快速搜索所选元素的源代码的功能。通过简单的操作,我们找到所需元素的源代码,并获得div具有指定类的块,我们将使用它进行采样。 使用 jsoup 轻松解析 HTML - 1让我们使用 org.jsoup.select.Elements 中的类Elements来选择所选块中的所有元素。
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
现在我们有这样的东西: 使用 jsoup 轻松解析 HTML - 2现在我们所要做的就是使用一个小循环来迭代所有元素:
for (Element element : listNews.select("a"))
            System.out.println(element.text());
该方法text()允许您丢弃标记代码,只为所有传入元素留下文本组合。执行结果如下: 使用 jsoup 轻松解析 HTML - 3很容易注意到,实际接收到的行数与页面上实际显示的行数并不对应。这就是陷阱所在。如果您查看标记的源代码,您会注意到最新新闻以特定时间间隔动态变化。其中一些“石头”可以通过额外的采样,当然还有测试来解决。可能结果是前五个元素将包含我们需要的信息,而第六个元素将仅包含脚本化的空行。块也可能没有任何标识符,那么可以使用方法直接指向get(int index)相关元素的位置号。
System.out.println(listNews.select("a").get(2).text());

结论

此示例仅展示了 jsoup 功能的一小部分。还有一个事实是,网站经常更新,改变标记代码的结构,因此在使用抓取时,您需要准备好适应变化。您可以在官方网站jsoup.org上获取更多信息和当前版本;您可以在o7planning.org上阅读有关类和方法的更多信息。我将留下一个指向我的github 的链接,在撰写本文时,有几个 Telegram 机器人使用 Jsoup 来接收和显示信息。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION