一.基础介绍

1.需求说明

有许多情况下,你可能需要使用 Java 解析 HTML。以下是一些常见的情况:

  1. 网页数据提取: 当你需要从网页中提取特定数据时,例如爬取网页内容并提取标题、链接、表格数据等。HTML 解析是必要的,因为它使你能够以结构化的方式访问和提取所需的信息。

  2. 数据清理和转换: 如果你有一些包含 HTML 标记的文本数据,你可能希望将其清理并转换为纯文本或其他格式。HTML 解析器可以帮助你处理这些标记,提取文本内容。

  3. Web 抓取和爬虫: 在开发 Web 爬虫或抓取工具时,HTML 解析是关键的。你需要解析从网页获取的 HTML 内容,从中提取有用的信息,并进行进一步的处理和存储。

  4. 数据分析: 在进行 Web 数据分析时,你可能需要解析和处理大量的 HTML 数据。这可能涉及从多个网页中提取数据,进行统计分析或生成报告。

  5. 屏幕抓取和自动化: 在自动化测试或屏幕抓取的情境中,你可能需要解析 HTML 来检查页面上的元素、属性或文本。

  6. Web 应用程序开发: 在开发 Web 应用程序时,可能需要从 HTML 表单中提取用户输入,处理提交的数据,或者在服务器端生成动态的 HTML 内容。

在这些情况下,使用 Java 中的 HTML 解析库(如 Jsoup)可以使你更方便地处理和操作 HTML 文档,从而实现你的需求。

2.Jsoup 简介

这个包是 Jsoup,是一个用于解析 HTML 文档的 Java 库。它提供了一种方便的方式来从 HTML 中提取和操作数据。

3.Jsoup 的功能

下面是一些 Jsoup 的主要功能以及一个简单的使用示例:

  1. HTML 解析: Jsoup 能够解析 HTML 文档,构建一个 Document 对象,便于进一步操作。

  2. 元素选择器: 提供类似于 CSS 选择器的语法,方便选择 HTML 文档中的特定元素。

  3. DOM 操作: 允许你在 HTML 文档中添加、修改或删除元素。

  4. 属性获取: 能够获取 HTML 元素的属性值。

  5. HTML 输出: 可以将 Document 对象输出为 HTML 字符串。

二.基本使用

1. 添加依赖

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.8.3</version>
</dependency>

2. 使用 Jsoup 解析 HTML 文档

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) {
        try {
            // 从URL加载HTML文档
            Document document = Jsoup.connect("http://example.com").get();

            // 通过CSS选择器选择所有h1元素
            Elements headings = document.select("h1");

            // 输出所有h1元素的文本内容
            for (Element heading : headings) {
                System.out.println("Heading: " + heading.text());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述示例演示了从 URL 加载 HTML 文档,使用 CSS 选择器选择所有 h1 元素,并输出它们的文本内容。你可以根据具体需求进一步操作文档的元素,进行数据提取或修改。请注意,需要处理异常,因为 Jsoup 的方法可能会抛出 IOException 等异常。

3.直接传入 html

@SpringBootTest
@AutoConfigureMockMvc
public class HtmlTest {
    @Test
    public void testHelloEndpoint() throws Exception {
        // 获取html的文档对象
        Document doc = Jsoup.parse("<html><body><h1>Hello, world!</h1></body></html>");
        // 获取页面下id="content"的标签
        Element content = doc.getElementById("answer_54474042");
        // 获取页面下的a标签
        Elements answersMoney = content.getElementsByClass("Answers_Money");
        final String text = answersMoney.text();
        System.out.println(text);
        // 定义正则表达式,匹配小数部分
        String regex = "\\d+\\.\\d+";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);
        // 查找匹配的部分
        if (matcher.find()) {
            String result = matcher.group();
            System.out.println("提取到的数字为: " + result);
        } else {
            System.out.println("未找到匹配的数字");
        }
    }
}

4.直接传入 URL

@SpringBootTest
@AutoConfigureMockMvc
public class HtmlUrlTest {
    @Test
    public void testHelloEndpoint() throws Exception {
        // 访问 URL 并获取 HTML 内容
        Document doc = Jsoup.connect("https://ask.csdn.net/questions/8058214/54474042?username=qyj19920704").get();
        // 获取页面下id="content"的标签
        Element content = doc.getElementById("answer_54474042");
        // 获取页面下的a标签
        Elements answersMoney = content.getElementsByClass("Answers_Money");
        final String text = answersMoney.text();
        System.out.println(text);
        // 定义正则表达式,匹配小数部分
        String regex = "\\d+\\.\\d+";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);
        // 查找匹配的部分
        if (matcher.find()) {
            String result = matcher.group();
            System.out.println("提取到的数字为: " + result);
        } else {
            System.out.println("未找到匹配的数字");
        }
    }
}
01-28 21:03