当前位置: 首页 > 软件库 > Web应用开发 > HTML解析器 >

Jsoupxpath

使用 xpath 解析 html 的解析器
授权协议 Apache
开发语言 Java
所属分类 Web应用开发、 HTML解析器
软件类型 开源软件
地区 国产
投 递 者 澹台星剑
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

JsoupXpath 是一款纯Java开发的使用xpath解析提取html数据的解析器,针对html解析完整实现了W3C XPATH 1.0标准语法,xpath的Lexer和Parser基于Antlr4构建,html的DOM树生成采用Jsoup,故命名为JsoupXpath. 为了在java里也享受xpath的强大与方便但又苦于找不到一款足够好用的xpath解析器,故开发了JsoupXpath。JsoupXpath的实现逻辑清晰,扩展方便, 支持完备的W3C XPATH 1.0标准语法,W3C规范:http://www.w3.org/TR/1999/REC-xpath-19991116 ,JsoupXpath语法描述文件Xpath.g4

快速开始

maven依赖:

   cn.wanghaomiao
   JsoupXpath
   ${latest-release-version}

示例:

String xpath="//div[@id='post_list']/div[./div/div/span[@class='article_view']/a/num()>1000]/div/h3/allText()";
String doc = "...";
JXDocument jxDocument = new JXDocument(doc);
Listrs = jxDocument.sel(xpath);
for (Object o:rs){
	if (o instanceof Element){
		int index = ((Element) o).siblingIndex();
		System.out.println(index);
	}
	System.out.println(o.toString());
}

 

其他可以参考 org.seimicrawler.xpath.JXDocumentTest,这里有大量的测试用例

 

语法

支持完备的W3C XPATH 1.0标准语法,W3C规范:http://www.w3.org/TR/1999/REC-xpath-19991116

这里是JsoupXpath的基于Antlr4的语法解析树示例,方便大家更快速的一览JsoupXpath的语法处理能力与语法解析执行过程

  • //ul[@class='subject-list']/li[./div/div/span[@class='pl']/num()>(1000+90*(2*50))][last()][1]/div/h2/allText() 这个主要是一些表达式嵌套的解析示例,点击图片可以查看大图 muti_expr

  • //ul[@class='subject-list']/li[not(contains(self::li/div/div/span[@class='pl']//text(),'14582'))]/div/h2//text()这个是对内置函数支持的一个解析示例,点击图片可以查看大图 functions

关于使用Xpath的一些注意事项

多数情况下是不建议直接粘贴Firefox或chrome里生成的Xpath,这些浏览器在渲染页面会根据标准自动补全一些标签,如table标签会自动加上tbody标签,这样生成的Xpath路径显然不是最通用的,所以很可能就取不到值。所以,要使用Xpath并感受Xpath的强大以及他所带来便捷与优雅最好就是学习下Xpath的标准语法,这样应对各种问题才能游刃有余,享受Xpath的真正威力!

函数

  • int position() 返回当前节点在其所在上下文中的位置

  • int last() 返回所在上下文的最后那个节点位置

  • int first() 返回所在上下文的的第一个节点位置

  • string concat(string, string, string*) 连接若干字符串

  • boolean contains(string, string) 判断第一个字符串是否包含第二个

  • int count(node-set) 计算给定的节点集合中节点个数

  • boolean starts-with(string, string) 判断第一个字符串是否以第二个开头

  • int string-length(string?) 如果给定了字符串则返回字符串长度,如果没有,那么则将当前节点转为字符串并返回长度

  • string substring(string, number, number?) 第一个参数指定字符串,第二个指定起始位置(xpath索引都是从1开始),第三指定要截取的长度,这里要注意在xpath的语法里这,不是结束的位置。

    substring("12345", 1.5, 2.6) returns "234"

    substring("12345", 2, 3) returns "234"

  • string substring-ex(string, number, number) 第一个参数指定字符串,第二个指定起始位置(java里的习惯从0开始),第三个结束的位置(支持负数),这个是JsoupXpath扩展的函数,方便java习惯的开发者使用。

  • string substring-after(string, string) 在第一个字符串中截取第二个字符串之后的部分

  • string substring-before(string, string) 在第一个字符串中截取第二个字符串之前的部分

开发者添加函数

以上只是Xpath1.0标准中的函数,开发亦可以方便快捷的添加自定义函数,只需实现 org.seimicrawler.xpath.core.Function.java接口并且包路径为package org.seimicrawler.xpath.core.function;即可,不需要修改语法范式,JsoupXpath运行时即可自动识别并加载(并不一定非要在一个jar中)。对于标准语法中目前JsoupXpath还未实现的函数,欢迎大家向主仓库提交Pull request,一起添砖添瓦。

NodeTest

  • allText()提取节点下全部文本,取代类似 //div/h3//text()这种递归取文本用法

  • html()获取全部节点的内部的html

  • outerHtml()获取全部节点的 包含节点本身在内的全部html

  • num()抽取节点自有文本中全部数字,如果知道节点的自有文本(即非子代节点所包含的文本)中只存在一个数字,如阅读数,评论数,价格等那么直接可以直接提取此数字出来。如果有多个数字将提取第一个匹配的连续数字。

  • text() 提取节点的自有文本

  • node() 提取所有节点

AxisName:  'ancestor'         //在当前上下文中节点的祖先中选择
  |  'ancestor-or-self'       //在当前上下文中节点的祖先及包括自身中选择
  |  'attribute'              //标记做提取节点属性运算
  |  'child'                  //在当前上下文中节点的子节点中选择 这是xpath默认的轴,如 /div/li 就是 /div/child::li 的简写
  |  'descendant'             //在当前上下文中节点的后代中选择
  |  'descendant-or-self'     //在当前上下文中节点的后代包括自身中选择
  |  'following'              //在当前上下文中节点后面的全部节点中选择
  |  'following-sibling'      //在当前上下文中节点后面的全部同胞节点中选择
  |  'parent'                 //在当前上下文中节点的父亲节点中选择
  |  'preceding'              //在当前上下文中节点前面的全部节点中选择
  |  'preceding-sibling'      //在当前上下文中节点前面的全部同胞节点中选择
  |  'self'                   //当前上下文中选择
  |  'following-sibling-one'  //在上下文中节点的前一个同胞节点中选择(JsoupXpath扩展)
  |  'preceding-sibling-one'  //在上下文中节点的下一个同胞节点选择(JsoupXpath扩展)
  |  'sibling'                //全部同胞(JsoupXpath扩展)(开发中。。。)
  ;

操作符

MINUS
       :  '-';
  PLUS
       :  '+';
  DOT
       :  '.';
  MUL
       : '*';
  DIVISION
       : '`div`';
  MODULO
       : '`mod`';
  DOTDOT
       :  '..';
  AT
       : '@';
  COMMA
       : ',';
  PIPE
       :  '|';
  LESS
       :  '<';
  MORE_
       :  '>';
  LE
       :  '=';
  START_WITH
       :  '^=';  // `a^=b` 字符串a以字符串b开头 a startwith b  (JsoupXpath扩展)
  END_WITH
       :  '$=';  // `a*=b` a包含b, a contains b   (JsoupXpath扩展)
  CONTAIN_WITH
       :  '*=';  // a包含b, a contains b  (JsoupXpath扩展)
  REGEXP_WITH
       :  '~=';  // a的内容符合 正则表达式b   (JsoupXpath扩展)
  REGEXP_NOT_WITH
       :  '!~';  //a的内容不符合 正则表达式b   (JsoupXpath扩展)
  • Jsoup jsoup 是一款Java 的XML、HTML解析器,可直接解析某个URL地址、HTML文本内容和已经存在的文件。 XML DOM和HTML DOM一样,都会将xml文件中的所有标签记载到内存并生成一个document对象保存他们   jsoup获取xml、html文件的document对象三种方式: 1.解析一个字符串获取Document对象 static  Document  pa

  • Jsoup jsoup 是一款Java 的XML、HTML解析器,可直接解析某个URL地址、HTML文本内容和已经存在的文件。 XML DOM和HTML DOM一样,都会将xml文件中的所有标签记载到内存并生成一个document对象保存他们 jsoup获取xml、html文件的document对象三种方式: 1.解析一个字符串获取Document对象 static  Document  pars

  • 依赖引入 // JsoupXpath会自动引入jsoup依赖 <dependency> <groupId>cn.wanghaomiao</groupId> <artifactId>JsoupXpath</artifactId> <version>2.3.2</version> </dependency> 代码说明 示例代码涉及以下内容: 一、Jsoup的用法       

  • JsoupXpath (https://github.com/zhegexiaohuozi/JsoupXpath)是一款纯Java开发的使用xpath解析提取html内容的解析器,xpath语法分析与执行完全独立,html的DOM树生成借助Jsoup,故命名为JsoupXpath. 为了在java里也享受xpath的强大与方便但又苦于找不到一款足够强大的xpath解析器,故开发了JsoupXpat

  • demojsoup5.java package Jsoup; import cn.wanghaomiao.xpath.model.JXDocument; import cn.wanghaomiao.xpath.model.JXNode; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; imp

  • jsoup选择器 jsoup指南 jsoup使用 xpath的语法 maven依赖 <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.2</version> </dependency>         使用前需要将jsoup的jar包build pat

  • Document document = Jsoup.parse(new URL("https://blog.csdn.net/u014172271"), 1000); Element title = document.getElementsByTag("title").first(); System.out.println(title.text());

 相关资料
  • 问题内容: 在.Net中,我发现了一个很棒的库HtmlAgilityPack,它使您可以使用XPath轻松解析格式不正确的HTML。我已经在.Net站点中使用了几年,但是我不得不为我的Python,Ruby和其他项目选择更痛苦的库。有人知道其他语言的类似库吗? 问题答案: 在python中,ElementTidy解析标记汤并生成一个元素树,该树允许使用XPath进行查询:

  • 本文向大家介绍php用xpath解析html的代码实例讲解,包括了php用xpath解析html的代码实例讲解的使用技巧和注意事项,需要的朋友参考一下 实例1 实例2 以上就是相关的2个实例内容,以及相关的代码, 感谢大家对呐喊教程的支持。

  • 这是我的示例html代码。 使用HtmlXpath Selector我需要解析html文件。 def parse(自己,响应):edxData=HtmlXpath Selector(响应) 首先,我需要获取所有包含 edxData.xpath 的标记('//h2[@class = “标题课程-标题”]') 在该标签内,我需要检查标签值。 然后需要解析带有类名字幕课程 - 字幕复制 - 详细信息的d

  • 我在使用jsoup(Java)解析html文档时遇到了一个问题。我正在分析的HTML具有以下格式: 我想在两个“hr”标记之间隔离HTML文本。我正在尝试以下代码: 系统出来println(对象); 但是ArrayList没有包含我想要的内容,我不知道如何解决它。(我是否可以将“hr”标记转换为“hr”文本“/hr”标记)?

  • 我想解析出这个Nasa页面上的描述,页面底部的文字 我该怎么做?

  • 主要内容:Java XPath解析器 解析XML文档的步骤,Java XPath解析器 解析XML文档的示例Java XPath解析器 解析XML文档的步骤 以下是使用 XPath Parser 解析文档时使用的步骤。 导入与 XML 相关的包。 创建一个文档生成器。 从文件或流创建文档。 创建一个 Xpath 对象和一个 XPath 路径表达式。 使用XPath.compile()编译 XPath 表达式,并通过XPath.evaluate()评估编译的表达式来获取节点列表。 迭代节点列表。

  • 本文向大家介绍使用PHP的HTML DOMDocument解析HTML,包括了使用PHP的HTML DOMDocument解析HTML的使用技巧和注意事项,需要的朋友参考一下 可以通过以下代码获取<div>标记内的<div>标记内的文本,其中<div>内的class =“ main”内- 示例 输出结果 这将产生以下输出-

  • HTML5 Boilerplate 默认提供两个 html 页面: index.html 404.html index.html no-js类 no-js 类可以让开发者依据 JavaScript 被启用(.js)或被禁止(.no-js)两种状态,更轻易准确地添加自定义样式。 使用这个技巧也有助于避免浏览器闪烁(FOUC)。 lang 属性 请认真考虑在 <html> 中添加 lang 属性,从而