JsoupJsoup入门


备注

Jsoup是一个用于Java的HTML解析和数据提取库,专注于灵活性和易用性。它可用于从HTML页面中提取特定数据,这通常称为“Web抓取”,以及修改HTML页面的内容,并使用允许的标记和属性的白名单“清理”不受信任的HTML。

JavaScript支持

Jsoup不支持JavaScript ,因此,无法从页面中提取在页面加载后添加到页面的任何动态生成的内容或内容。如果你需要提取的内容被添加到使用JavaScript的网页, 几个备选方案:

  • 使用支持JavaScript的库,例如Selenium,它使用实际的Web浏览器来加载页面,或者使用HtmlUnit。

  • 反向设计页面加载数据的方式。通常,通过AJAX动态加载数据的网页会这样做,因此,您可以查看浏览器开发人员工具的网络选项卡,以查看数据的加载位置,然后在您自己的代码中使用这些URL。了解更多详细信息,了解如何抓取AJAX页面

官方网站和文档

您可以在jsoup.org上找到各种Jsoup相关资源,包括JavadocJsoup cookbook用法示例和JAR下载 。请参阅GitHub存储库以获取源代码,问题和请求。

下载

Jsoup在Maven上可用作org.jsoup.jsoup:jsoup ,如果您正在使用Gradle(例如,使用Android Studio),您可以通过将以下内容添加到build.gradle依赖项部分来将其添加到项目中:

compile 'org.jsoup:jsoup:1.8.3'

如果您正在使用Ant(Eclipse),请将以下内容添加到POM依赖项部分:

<dependency>
  <!-- jsoup HTML parser library @ http://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.8.3</version>
</dependency>

Jsoup也可用作其他环境的可下载JAR

版本

发布日期
1.9.2 2016年5月17日
1.8.3 2015年8月2日

从部分HTML中提取完整的URL

仅选择链接的属性值:href将返回相对URL。

   String bodyFragment = 
          "<div><a href=\"/documentation\">Stack Overflow Documentation</a></div>";


    Document doc = Jsoup.parseBodyFragment(bodyFragment);
    String link = doc
            .select("div > a")
            .first()
            .attr("href");
    
    System.out.println(link);
 

产量

/documentation
 

通过将基URI传递给parse 方法并使用absUrl 方法而不是attr ,我们可以提取完整的URL。

    Document doc = Jsoup.parseBodyFragment(bodyFragment, "http://stackoverflow.com");
    
    String link = doc
                .select("div > a")
                .first()
                .absUrl("href");
    
    System.out.println(link);
 

产量

http://stackoverflow.com/documentation
 

从HTML文档文件中提取数据

Jsoup可用于操作或从包含HTML的本地文件中提取数据。 filePath 是磁盘上文件的路径。 ENCODING 是所需的Charset Name,例如“Windows-31J”。这是可选的。

 // load file
    File inputFile = new File(filePath);
    // parse file as HTML document
    Document doc = Jsoup.parse(filePath, ENCODING);
    // select element by <a> 
    Elements elements = doc.select("a");
 

提取链接的URL和标题

Jsoup可用于从网页轻松提取所有链接。在这种情况下,我们可以使用Jsoup仅提取我们想要的特定链接,这里是页面上h3 标题中的链接。我们还可以获得链接的文本。

Document doc = Jsoup.connect("http://stackoverflow.com").userAgent("Mozilla").get();
for (Element e: doc.select("a.question-hyperlink")) {
    System.out.println(e.attr("abs:href"));
    System.out.println(e.text());
    System.out.println();
}
 

这给出了以下输出:

http://stackoverflow.com/questions/12920296/past-5-week-calculation-in-webi-bo-4-0
Past 5 week calculation in WEBI (BO 4.0)?

http://stackoverflow.com/questions/36303701/how-to-get-information-about-the-visualized-elements-in-listview
How to get information about the visualized elements in listview?

[...]
 

这里发生了什么事:

  • 首先,我们从指定的URL获取HTML文档。此代码还将请求的用户代理标头设置为“Mozilla”,以便网站提供通常用于浏览器的页面。

  • 然后,使用select(...) 和for循环来获取Stack Overflow问题的所有链接,在这种情况下,链接具有类question-hyperlink

  • 使用.text() 打印每个链接的文本,并使用attr("abs:href") 打印链接的href。在这种情况下,我们使用abs: 来获取绝对 URL,即。包括域和协议。