0

0

如何用Java解析HTML文档 Java HTML解析库使用方法

看不見的法師

看不見的法師

发布时间:2025-07-18 11:42:02

|

849人浏览过

|

来源于php中文网

原创

在java中解析html文档,最常用且高效的方法是使用jsoup库。1. 首先,将jsoup添加为项目依赖(maven或gradle);2. 然后通过jsoup.connect()从url、字符串或文件加载html文档;3. 使用dom操作和css选择器来查找、提取和修改元素;4. 针对不规范html、动态内容、乱码和反爬等挑战,可分别依靠jsoup的容错能力、结合selenium/htmlunit、显式指定编码、设置请求头等方式应对;5. jsoup的选择器语法支持全面,能够实现精准的数据提取;6. 其他java html解析库如htmlunit(支持javascript执行)、jericho(高性能但api复杂)、nekohtml(修复不规范html)可根据具体需求选用。

如何用Java解析HTML文档 Java HTML解析库使用方法

在Java中解析HTML文档,最常用且高效的方法是利用专门的HTML解析库,其中Jsoup无疑是我的首选。它提供了一套非常直观的API,能够轻松地从URL、文件或字符串中解析HTML,并使用DOM、CSS选择器或XPath等方法来查找、修改和提取数据。

如何用Java解析HTML文档 Java HTML解析库使用方法

解决方案

要使用Java解析HTML,Jsoup库是你的得力助手。它将HTML解析成一个可操作的DOM树,然后你可以像操作XML文档一样去遍历和查询它。

首先,你需要将Jsoup库添加到你的项目依赖中。如果你使用Maven,在pom.xml中加入:

立即学习Java免费学习笔记(深入)”;

如何用Java解析HTML文档 Java HTML解析库使用方法

    org.jsoup
    jsoup
    1.17.2

如果你是Gradle项目,则在build.gradle中:

implementation 'org.jsoup:jsoup:1.17.2'

接着,就可以开始解析了。Jsoup提供了几种加载HTML的方式:

如何用Java解析HTML文档 Java HTML解析库使用方法
  1. 从URL加载: 这是最常见的场景,直接从网页抓取内容。

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    public class HtmlParserExample {
        public static void main(String[] args) {
            try {
                // 连接到指定的URL并获取HTML文档
                Document doc = Jsoup.connect("https://www.example.com").get();
    
                // 获取页面的标题
                String title = doc.title();
                System.out.println("页面标题: " + title);
    
                // 使用CSS选择器查找所有段落元素
                Elements paragraphs = doc.select("p");
                System.out.println("\n所有段落内容:");
                for (Element p : paragraphs) {
                    System.out.println(p.text());
                }
    
                // 查找特定ID的元素
                Element specificDiv = doc.getElementById("my-unique-id");
                if (specificDiv != null) {
                    System.out.println("\n特定ID元素内容: " + specificDiv.text());
                }
    
                // 查找带有特定class的链接
                Elements links = doc.select("a.my-link-class");
                System.out.println("\n特定class的链接:");
                for (Element link : links) {
                    System.out.println("文本: " + link.text() + ", URL: " + link.attr("href"));
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  2. 从字符串加载: 如果你已经有HTML内容的字符串,可以直接解析。

    String html = "测试页面

    Hello Jsoup!

    链接"; Document doc = Jsoup.parse(html); System.out.println("字符串解析的标题: " + doc.title());
  3. 从文件加载: 解析本地HTML文件。

    // 假设你的项目根目录下有一个 test.html 文件
    // Document doc = Jsoup.parse(new File("test.html"), "UTF-8");
    // System.out.println("文件解析的标题: " + doc.title());

Jsoup的强大之处在于它的选择器引擎,它几乎支持所有CSS3选择器,让你可以非常精准地定位到想要的元素。

使用Java解析HTML文档时常见的挑战及应对策略

解析HTML这事儿,从来就不是一帆风顺的。我个人在处理这类需求时,总会遇到一些头疼的问题。最常见的,莫过于那些“不那么标准”的HTML。你懂的,网络上的HTML千奇百怪,很多时候不是严格遵守W3C标准的,或者干脆就是有语法错误的。Jsoup在这方面做得不错,它有很强的容错能力,能够处理大多数畸形的HTML,并将其解析成一个可用的DOM树。但话说回来,如果HTML结构错得离谱,或者关键标签缺失,那即使是Jsoup也无力回天,你可能需要一些预处理或者更复杂的逻辑来判断。

另一个大挑战是动态加载的内容。有时候你会遇到那种,明明页面上能看到的数据,Jsoup却抓不到。这时候就得留心是不是JavaScript在作祟了。很多现代网站的数据是通过AJAX请求在页面加载完成后才动态填充的,Jsoup本身并不执行JavaScript。对于这种情况,你需要考虑使用像Selenium或HtmlUnit这样的工具。它们能模拟浏览器行为,执行JavaScript,从而获取到完整的页面内容。当然,这会增加复杂性和资源消耗。

再来就是编码问题。乱码是抓取网页时常见的“噩梦”。网页的编码声明可能不正确,或者服务器返回的编码与实际内容不符。Jsoup在Jsoup.connect().get()时会尝试自动检测编码,但有时也可能出错。如果出现乱码,你可以尝试在连接时显式指定编码,例如Jsoup.connect(url).charset("GBK").get()

最后,反爬机制也是一个不可忽视的挑战。有些网站会检测请求头、IP访问频率、User-Agent等,如果发现是非浏览器行为,可能会拒绝服务或者返回虚假内容。应对这些,你可能需要设置合适的User-Agent、使用代理IP池、控制访问频率,甚至模拟更复杂的请求头信息。这已经超出了单纯HTML解析的范畴,更像是网络爬虫的范畴了。

如何利用CSS选择器精确提取HTML数据

Jsoup的CSS选择器功能,简直是它的灵魂所在。我个人觉得,掌握了Jsoup的选择器,就掌握了HTML数据提取的精髓。它几乎支持所有你用在前端CSS样式表里的选择器语法,而且用起来简直是丝滑。

Android数据格式解析对象JSON用法 WORD版
Android数据格式解析对象JSON用法 WORD版

本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

假设我们有以下HTML片段:

商品A

¥100

查看详情

商品B

¥200

查看详情

商品C

¥300

查看详情

现在我们来实战一下:

  • 选择所有div元素:Elements divs = doc.select("div");

  • 选择ID为products的元素:Element productsDiv = doc.select("#products").first();.first()用来获取第一个匹配的元素,因为ID是唯一的)

  • 选择所有class为item的元素:Elements items = doc.select(".item");

  • 选择所有div标签下,并且class为item的元素:Elements itemsInDiv = doc.select("div.item");

  • 选择所有item元素内部的h3标签:Elements titles = doc.select(".item h3"); 这将获取所有商品标题。

  • 选择所有item元素内部,并且class为pricep标签:Elements prices = doc.select(".item p.price"); 然后你可以遍历这些元素并获取文本:

    for (Element price : prices) {
        System.out.println("价格: " + price.text()); // 输出:¥100, ¥200, ¥300
    }
  • 选择带有data-sku属性的元素,并获取其属性值:Elements elementsWithSku = doc.select("[data-sku]");

    for (Element el : elementsWithSku) {
        System.out.println("SKU: " + el.attr("data-sku")); // 输出:SKU001, SKU002, SKU003
    }
  • 选择data-sku属性值为SKU002的元素:Element specificSkuItem = doc.select("[data-sku=SKU002]").first();

  • 选择同时拥有itemspecial-item两个class的元素:Elements specialItems = doc.select(".item.special-item");

  • 选择products这个ID下的所有直接子元素(>表示直接子元素):Elements directChildren = doc.select("#products > div");

通过这些灵活的组合,你可以非常精确地定位到HTML文档中的任何一部分数据。这比传统的字符串匹配或者正则表达式要强大和稳定得多,因为它是基于DOM结构的。

除了Jsoup,Java还有哪些HTML解析库?它们各有什么特点?

虽然Jsoup是我处理HTML解析任务的首选,但Java生态系统中并非只有它一个选项。了解其他库的特点,能帮助你在特定场景下做出更合适的选择。

  1. HtmlUnit:

    • 特点: HtmlUnit是一个“无头浏览器”(headless browser),这意味着它能模拟一个真正的Web浏览器,包括执行JavaScript、处理CSS、管理Cookie、提交表单等。它不像Jsoup那样仅仅解析HTML结构,而是会渲染页面并模拟用户交互。
    • 适用场景: 当你需要解析的网页内容是动态加载(由JavaScript生成)时,或者你需要模拟用户登录、点击等复杂交互时,HtmlUnit是Jsoup无法替代的。
    • 缺点: 性能开销相对较大,因为它需要加载和执行整个页面的资源,配置和使用也比Jsoup复杂。
  2. Jericho HTML Parser:

    • 特点: 这是一个比较老牌的HTML解析库,它更注重HTML标签的结构和内容,提供了SAX(Simple API for XML)和DOM两种解析方式。它的特点是解析速度快,内存占用相对较低。
    • 适用场景: 如果你的HTML文档非常大,或者你对性能有极高的要求,并且内容不需要JavaScript渲染,Jericho可能是一个选择。
    • 缺点: API不如Jsoup直观,特别是对于CSS选择器的支持不如Jsoup强大和易用,学习曲线相对陡峭。
  3. NekoHTML:

    • 特点: NekoHTML是一个HTML解析器,它的主要优势在于能够解析非常糟糕、不规范的HTML文档,并将其转换为结构良好的XML或XHTML。它通常作为其他XML解析器(如Xerces)的前端处理器来使用。
    • 适用场景: 当你遇到的HTML文档质量极差,甚至Jsoup都难以处理时,NekoHTML可能能将其“修复”成可解析的格式。它更偏向于“清理”HTML。
    • 缺点: 它的主要目标是生成格式良好的XML,而不是提供便捷的数据提取API。你可能需要结合XPath或其他XML解析工具来提取数据。

总的来说,对于大多数日常的HTML解析和数据抓取任务,Jsoup因其简洁的API、强大的CSS选择器支持和良好的容错能力,依然是我的首选。只有当遇到需要JavaScript执行或复杂浏览器模拟的场景时,我才会考虑HtmlUnit;而对于非常规的、需要预处理的HTML,或者对性能有极致追求的场景,Jericho或NekoHTML才可能进入我的考虑范围。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

804

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

723

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

727

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

395

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16861

2023.08.03

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

0

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.1万人学习

Go 教程
Go 教程

共32课时 | 3.1万人学习

MongoDB 教程
MongoDB 教程

共17课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号