Java XPath 使用(2023/08/29)
1. 前言
众所周知,Java 语言适合应用于 Web 开发领域,不擅长用来编写爬虫。但在 Web 开发过程中有时又存在爬取数据的需求,此时采用其它语言编写独立爬虫模块的话存在维护不方便的问题,所以此处笔者选择了使用 Java + XPath 实现简单的爬虫功能,如果爬虫需求较多且复杂还是推荐采用其它语言实现独立的爬虫模块。
2. 技术选型
-
JsoupXpath
- 优点:使用简单;
- 缺点:对 XPath 语法的支持有限;
-
xsoup
- 优点:使用简单;
- 缺点:对 XPath 语法的支持有限;
-
HtmlCleaner
- 优点:使用简单;
- 缺点:对 XPath 语法的支持有限;
-
Java XPath
- 优点:对 XPath 语法支持全面;
- 缺点:对 xml 格式要求严格,几乎没有 Html 可以通过解析;
-
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 种方案的实现。
-
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>
-
获取页面内容,并解析获取结果;文章来源:https://www.toymoban.com/news/detail-693427.html
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()); } }
参考文章:文章来源地址https://www.toymoban.com/news/detail-693427.html
- 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 java.Just try it. (github.com);
- code4craft/xsoup: When jsoup meets XPath. (github.com);
到了这里,关于Java XPath 使用(2023/08/29)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!