Java XPath 使用(2023/08/29)

Java XPath 使用(2023/08/29)

文章目录

  • [Java XPath 使用(2023/08/29)](#Java XPath 使用(2023/08/29))
    • [1. 前言](#1. 前言)
    • [2. 技术选型](#2. 技术选型)
    • [3. 技术实现](#3. 技术实现)

1. 前言

众所周知,Java 语言适合应用于 Web 开发领域,不擅长用来编写爬虫。但在 Web 开发过程中有时又存在爬取数据的需求,此时采用其它语言编写独立爬虫模块的话存在维护不方便的问题,所以此处笔者选择了使用 Java + XPath 实现简单的爬虫功能,如果爬虫需求较多且复杂还是推荐采用其它语言实现独立的爬虫模块。

2. 技术选型

  1. JsoupXpath
    • 优点:使用简单;
    • 缺点:对 XPath 语法的支持有限;
  2. xsoup
    • 优点:使用简单;
    • 缺点:对 XPath 语法的支持有限;
  3. HtmlCleaner
    • 优点:使用简单;
    • 缺点:对 XPath 语法的支持有限;
  4. Java XPath
    • 优点:对 XPath 语法支持全面;
    • 缺点:对 xml 格式要求严格,几乎没有 Html 可以通过解析;
  5. HtmlCleaner + Java XPath
    • 优点:对 XPath 语法支持全面;
    • 缺点:使用相对复杂;

3. 技术实现

http://www.jnswj.net/jsp/sw/jnsw-skhdsq.jsp 网站和 //*[@id="MainTable"]/tbody/tr[position()>=5 and position()<=22]/td[position()=1 or (position()>=9 and position()<=13)] XPath 表达式为例,笔者测试了上述 5 种技术方案,其中只有第 5 种方案通过了测试,其它几种均出现了报错,故此处仅介绍第 5 种方案的实现。

  1. Maven 引入依赖;

    xml 复制代码
    <!-- 获取 HTML 页面内容 -->
    <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-http -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-http</artifactId>
        <version>5.8.21</version>
    </dependency>
    
    <!-- 解析 HTML -->
    <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlcleaner/htmlcleaner -->
    <dependency>
        <groupId>net.sourceforge.htmlcleaner</groupId>
        <artifactId>htmlcleaner</artifactId>
        <version>2.29</version>
    </dependency>
  2. 获取页面内容,并解析获取结果;

    java 复制代码
    import cn.hutool.http.HttpUtil;
    import org.htmlcleaner.CleanerProperties;
    import org.htmlcleaner.DomSerializer;
    import org.htmlcleaner.HtmlCleaner;
    import org.htmlcleaner.TagNode;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
    
    
    /**
     * 测试 HtmlCleaner + Java XPath.
     *
     * @author <a href="mailto:xiaoQQya@126.com">xiaoQQya</a>
     * @since 2023/08/29
     */
    private void test throws ParserConfigurationException, XPathExpressionException {
        // 获取 HTML 页面内容
        String url = "http://www.jnswj.net/jsp/sw/jnsw-skhdsq.jsp";
        String html = HttpUtil.get(url);
    
        // 解析 HTML 页面内容
        HtmlCleaner hc = new HtmlCleaner();
        TagNode tn = hc.clean(html);
        Document document = new DomSerializer(new CleanerProperties()).createDOM(tn);
        
        // 匹配获取需要的数据
        XPath xPath = XPathFactory.newInstance().newXPath();
        String exp = "//*[@id=\"MainTable\"]/tbody/tr[position()>=5 and position()<=22]/td[position()=1 or (position()>=9 and position()<=13)]";
        NodeList nodes = (NodeList) xPath.evaluate(exp, document, XPathConstants.NODESET);
    
        for (int length = nodes.getLength(), i = 0; i < length; i++) {
            Node item = nodes.item(i);
            System.out.println(item.getTextContent());
        }
    }

参考文章:

相关推荐
李昊哲小课2 分钟前
HTML 完整教程与实践
前端·html
一只乔哇噻11 分钟前
java后端工程师进修ing(研一版‖day44)
java·开发语言·学习·算法
老华带你飞17 分钟前
畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·畅阅读系统小程序
卓码软件测评3 小时前
第三方软件测试机构【性能测试工具用LoadRunner还是JMeter?】
java·功能测试·测试工具·jmeter·性能优化
Lionel_SSL7 小时前
《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
java·开发语言·jvm
记得开心一点嘛7 小时前
手搓Springboot
java·spring boot·spring
老华带你飞7 小时前
租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·租房系统管理平台
独行soc7 小时前
2025年渗透测试面试题总结-66(题目+回答)
java·网络·python·安全·web安全·adb·渗透测试
脑子慢且灵8 小时前
[JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
java·后端·servlet·tomcat·intellij-idea·web
华仔啊9 小时前
SpringBoot 中 6 种数据脱敏方案,第 5 种太强了,支持深度递归!
java·后端