Java XPath 使用(2023/08/29)

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 引入依赖;

    <!-- 获取 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. 获取页面内容,并解析获取结果;

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

参考文章:

更多推荐