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());
        }
    }

参考文章:

相关推荐
JH30731 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
工程师老罗2 小时前
YoloV1数据集格式转换,VOC XML→YOLOv1张量
xml·人工智能·yolo
喵手2 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Coder_Boy_2 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble3 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟3 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖3 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707534 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_4 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.4 小时前
Day06——权限认证-项目集成
java