博主
258
258
258
258
专辑

第一节 Jsoup简介

亮子 2022-02-21 06:19:56 5262 0 0 0

1、简介

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

  • Jsoup官网

https://jsoup.org/

jsoup

2、主要功能

jsoup 的主要功能如下:

  • 从一个 URL,文件或字符串中解析 HTML;
  • 使用 DOM 或 CSS 选择器来查找、取出数据;
  • 可操作 HTML 元素、属性、文本;
  • jsoup 是基于 MIT 协议发布的,可放心使用于商业项目。
  • jsoup 的类层次结构

其中,要被解析的HTML可以是一个HTML的字符串,可以是一个URL,可以是磁盘上的一个普通文件

3、使用介绍

org.jsoup.Jsoup把输入的HTML转换成一个org.jsoup.nodes.Document对象,然后从Document对象中取出想要的元素。
org.jsoup.nodes.Document继承了org.jsoup.nodes.Element,Element又继承了org.jsoup.nodes.Node类。里面提供了丰富的方法来获取HTML的元素。
下面是几种常见的应用场景举例说明 jsoup 是如何进行 HTML 文档处理的。

  • 从字符串输入

jsoup 可以从包括字符串、URL 地址以及本地文件来加载 HTML 文档,并生成 Document 对象实例。

 // 直接从字符串中输入 HTML 文档
 String html = "<html><head><title> 开源中国社区 </title></head>"
  + "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>";
 Document doc = Jsoup.parse(html);
  • 从URL中输入
 Document doc = Jsoup.connect("http://www.oschina.net/").get();
 String title = doc.title();

其中Jsoup.connect(“xxx”)方法返回一个org.jsoup.Connection对象。
在Connection对象中,我们可以执行get或者post来执行请求。
但是在执行请求之前我们可以使用Connection对象来设置一些请求信息。比如:头信息,cookie,请求等待时间,代理等等来模拟浏览器的行为。

Document doc = Jsoup.connect("http://www.oschina.net/")
  .data("query", "Java")// 请求参数,传参
  .userAgent("Mozilla")// 设置 User-Agent ,伪装成浏览器
  .cookie("auth", "token")// 设置 cookie,添加cookie信息
  .timeout(3000)// 设置连接超时时间
  .post();// 使用 POST 方法访问 URL
  • 从本地文件中解析
//从本地文件中,通过Id,获取下面的标签
File input = new File("E:/test.html");
Document doc = Jsoup.parse(input, "UTF-8");

4、解析并提取 HTML 元素

这部分涉及一个 HTML 解析器最基本的功能,但 jsoup 使用一种有别于其他开源项目的方式——选择器,不过 jsoup 也提供了传统的 DOM 方式的元素解析。

//从本地文件中,通过Id,获取下面的标签
 File input = new File("E:/test.html");
 Document doc = Jsoup.parse(input, "UTF-8");
 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 提供简单的方法供你自己检索这些数据。

  • getElementById(String id):通过id来获取
  • getElementsByTag(String tagName):通过标签名字来获取
  • getElementsByClass(String className):通过类名来获取
  • getElementsByAttribute(String key):通过属性名字来获取
  • getElementsByAttributeValue(String key, String value):通过指定的属性名字,属性值来获取
  • getAllElements():获取所有元素

通过类似于css或jQuery的选择器来查找元素
使用的是Element类的下记方法:
public Elements select(String cssQuery)
通过传入一个类似于CSS或jQuery的选择器字符串,来查找指定元素。

public void test4() throws IOException {
    File input = new File("e:/test.html");
    Document doc = Jsoup.parse(input,"UTF-8");
    Elements links = doc.select("a[href]"); // 找出具有 href 属性的链接
    Elements pngs = doc.select("img[src$=.png]");// 找出所有png 图片的元素
    Element masthead = doc.select("div.headline").first();// 找出定义了 class="headline" 的元素
    Elements resultLinks = doc.select("h3.simple-item__title > a"); // 找出了h3标签下的a标签
    System.out.println(links);
}