内容简介:简介 JsoupXpath 是一款纯Java开发的使用xpath解析提取html数据的解析器,针对html解析完全重新实现了W3C XPATH 1.0标准语法,xpath的Lexer和Parser基于Antlr4构建,html的DOM树生成采用Jsoup,故命名为JsoupXpat...
简介
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
更新内容
- 修复了 PrecedingSiblingOneSelector 这个函数无效的问题 , 感谢@s24963386贡献!
- 修复 #Issue66 ,函数参数表达式使用的上下文不够全面的问题
- 优化
text()块节点属性信息,以便更好的支持倒序索引 - 增加
double/long sum(node-set)函数,计算给定的节点集合中数字节点值的和,计算参数范围内包含非数字内容则计算无效。 - 优化
num()结果表现,尽量符合用户使用直觉。整数返回整数,浮点数返回浮点数,不再统一只返回浮点数。
相关Test:
@Test
public void issue64And65(){
String content = "<div class='a'>1</div>\n" +
"<div>2</div>\n" +
"<div class='a'>3</div>\n" +
"<div>4</div>\n" +
"<div>5</div>";
JXDocument j = JXDocument.create(content);
Assert.assertEquals("2", j.selNOne("//div[text()='3']/preceding-sibling-one::div/text()").asString());
Assert.assertEquals("4", j.selNOne("//div[text()='3']/following-sibling-one::div/text()").asString());
}
@Test
public void issue66() throws Exception {
JXDocument j = JXDocument.create(FileUtils.readFileToString(new File(loader.getResource("issue66.html").toURI()), Charset.forName("utf8")));
logger.info("{}", j.selN("count(//bookstore/book)"));
logger.info("{}", j.selN("//bookstore/book[position()<count(//bookstore/book)]/price"));
logger.info("{}", j.selN("//bookstore/book[position()<count(//bookstore/book)-1]/price"));
logger.info("{}", j.selN("sum(//bookstore/book/year[num()<2005])"));
logger.info("{}", j.selN("sum(//bookstore/book/price)"));
logger.info("{}", j.selN("sum(//bookstore/book/title)"));
Assert.assertEquals(4,j.selNOne("count(//bookstore/book)").asLong().longValue());
Assert.assertEquals(3,j.selN("//bookstore/book[position()<count(//bookstore/book)]/price").size());
Assert.assertEquals(2,j.selN("//bookstore/book[position()<count(//bookstore/book)-1]/price").size());
Assert.assertEquals(4006,j.selNOne("sum(//bookstore/book/year[num()<2005])").asLong().longValue());
Assert.assertEquals("",j.selNOne("sum(//bookstore/book/title)").asString());
}
写在最后
欢迎大家贡献新特性
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Java HTML 解析器 jsoup 发布 1.13.1,解析速度显著提升
- Expat 2.2.8 发布,XML 解析器
- MediaInfo 20.03 发布,多媒体文件解析软件
- JsoupXPath v2.0-Beta 发布,HTML 解析器
- Kubernetes 1.12全新发布!新功能亮点解析
- MediaInfo 19.07 发布,多媒体文件解析软件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
活着就为改变世界
[美] 杰弗里·扬、威廉·西蒙 / 蒋永军 / 中信出版社 / 2010-6 / 39.00元
内容简介 苹果公司CEO史蒂夫•乔布斯这个一直活在自己想象的世界里的创业奇才,经历过各种挫折与失落,但他那无所畏惧、敢于承担的个性让他一直努力实践着自己的价值观,总能为他的离奇想法找到解决问题的办法。 本书两位作者通过深入访谈和资料调查,揭秘了许多乔布斯个人的创业经历和家庭变故,为大家塑造了一个活生生的“乔布斯式”的鲜活人物,描述了一个个充满传奇色彩的商业奇迹,真实地再现了乔布斯几十年......一起来看看 《活着就为改变世界》 这本书的介绍吧!
