Java XPath 使用(2023/08/29)

news/2024/7/19 12:25:35 标签: java, 爬虫, xml, html
html" title=xml>xmlns="http://www.w3.org/2000/svg" style="display: none;">

Java XPath 使用(2023/08/29)

文章目录

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

1. 前言

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

2. 技术选型

  1. JsoupXpath
    • 优点:使用简单;
    • 缺点:对 XPath 语法的支持有限;
  2. xsoup
    • 优点:使用简单;
    • 缺点:对 XPath 语法的支持有限;
  3. HtmlCleaner
    • 优点:使用简单;
    • 缺点:对 XPath 语法的支持有限;
  4. Java XPath
    • 优点:对 XPath 语法支持全面;
    • 缺点:对 html" title=xml>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 引入依赖;

    html" title=xml>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. 获取页面内容,并解析获取结果;

    html" title=java>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 html" title=java>javax.html" title=xml>xml.parsers.ParserConfigurationException;
    import html" title=java>javax.html" title=xml>xml.xpath.XPath;
    import html" title=java>javax.html" title=xml>xml.xpath.XPathConstants;
    import html" title=java>javax.html" title=xml>xml.xpath.XPathExpressionException;
    import html" title=java>javax.html" title=xml>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());
        }
    }
    

参考文章:

  • Java - XPath解析爬取内容 - Jinkora - 博客园 (cnblogs.com);
  • Intro to XPath with Java | Baeldung;
  • zhegexiaohuozi/JsoupXpath: 纯Java实现的支持W3C Xpath 1.0标准语法的HTML解析器。A html parser with xpath base on Jsoup and Antlr4. Maybe it is the best in html" title=java>java.Just try it. (github.com);
  • code4craft/xsoup: When jsoup meets XPath. (github.com);

http://www.niftyadmin.cn/n/4983234.html

相关文章

VBA:按照Excel工作表中的名称列自动汇总多个工作薄中对应sheet中所需要的数据

需求如下&#xff1a; B列为产品名为合并单元格&#xff0c;C列为供应商名&#xff0c;G、H列为金额数据&#xff1b;数据源放在同一个文件夹内&#xff0c;B列产品名来源于工作薄名称中间的字符串&#xff0c;C列供应商名来源于工作薄中的sheet名&#xff1b;G、H列金额数据来…

docker 安装 mysql 并挂载 配置文件和数据目录

1、宿主机创建挂载目录 sudo mkdir /path/mysql/data sudo mkdir /path/mysql/conf2、搜索镜像 docker search mysql拉取官方支持版本&#xff08;OFFICIAL 为 ok的版本&#xff09; docker pull mysql:latest3、以 mysql 作为基础镜像构建容器并挂载目录 docker run -d -p…

数据库CPU飙高问题定位及解决

在业务服务提供能力的时候&#xff0c;常常会遇到CPU飙高的问题&#xff0c;遇到这类问题&#xff0c;大多不是数据库自身问题&#xff0c;都是因为使用不当导致&#xff0c;这里记录下业务服务如何定位数据库CPU飙高问题并给出常见的解决方案。 CPU 使用率飙升根因分析 在分…

vue2使用 vis-network 和 vue-vis-network 插件封装一个公用的关联关系图

效果图&#xff1a; vis组件库&#xff1a;vis.js vis-network中文文档&#xff1a;vis-network 安装组件库&#xff1a; npm install vis-network vue-vis-network 或 yarn add vis-network vue-vis-network 新建RelationGraph.vue文件&#xff1a; <template><…

Ansible学习笔记(持续更新)

Ansible学习目录 1.自动化运维1.1 企业实际应用场景1.1.1 Dev开发环境1.1.2 测试环境1.1.3 发布环境1.1.4 生产环境1.1.5 灰度环境 1.2 程序发布1.3 自动化运维应用场景1.4 常用自动化运维工具 2.Ansible介绍和架构2.1 Ansible特性2.2 Ansible架构2.2.1 Ansible主要组成部分2.2…

Code Lab - 34

GAT里面有一些地方看的不是太懂&#xff08;GAT里Multi Attention的具体做法&#xff09;&#xff0c;暂时找了参考代码&#xff0c;留一个疑问 1. 一个通用的GNN Stack import torch_geometric import torch import torch_scatter import torch.nn as nn import torch.nn.fun…

如何用selenium或pyppeteer来启动多个AdsPower窗口

前言 本文是该专栏的第57篇,后面会持续分享python爬虫干货知识,记得关注。 关于selenium或pyppeteer来启动打开adspower浏览器的方法,笔者在本专栏前面有详细介绍过,感兴趣的同学可往前翻阅《如何用selenium或pyppeteer来链接并打开指纹浏览器AdsPower》,文章内容包含完整…