HTMLCleaner是否支持XPath position()函数与位置谓词?代码问题求助
HTMLCleaner对XPath位置语法的支持及你的问题解决方案
首先明确:HTMLCleaner完全支持XPath 1.0的position()函数和位置谓词(比如tr[3]这种写法),你的问题并不是语法不支持导致的,而是XPath路径和实际解析后的HTML结构不匹配。
问题根源分析
你爬取的目标页面http://jobs.alaska.gov/RR/WARN_notices.htm的原始HTML中,嵌套的表格并没有包含tbody标签——很多现代浏览器会自动给表格补全tbody,但HTMLCleaner会严格按照原始HTML解析,不会自动添加这个标签。你写的XPath里嵌套了多层tbody,这就导致路径无法匹配到实际的DOM节点:
- 你的
xpathOne能返回结果,大概率是因为某个层级的tr[1]刚好在没有tbody的路径上意外匹配到了,但xpathTwo的路径因为tbody的存在完全走不通。
修复方案
去掉XPath中所有多余的tbody节点,修改后的XPath如下:
String xpathOne = "//table[2]/tr/td/table/tr/td/table/tr[1]/td/div/span/text()"; String xpathTwo = "//table[2]/tr/td/table/tr/td/table/tr[3]/td/div/span/text()";
这样修改后,xpathTwo就能正确匹配到表格的第一行数据了。
额外验证技巧
如果之后再遇到类似的XPath匹配问题,可以用HTMLCleaner的prettyPrint()方法打印解析后的DOM结构,直观查看实际的节点层级:
rootTagNode.prettyPrint(System.out);
这样你就能清楚看到哪些标签是实际存在的,避免写出和实际结构不符的XPath。
关于position()函数的使用
顺便验证一下position()的用法,你也可以把tr[3]写成tr[position()=3],效果完全一致,比如:
String xpathTwo = "//table[2]/tr/td/table/tr/td/table/tr[position()=3]/td/div/span/text()";
这个写法同样能正常工作,进一步说明HTMLCleaner对位置相关XPath语法的支持是完整的。
内容的提问来源于stack exchange,提问作者Foobar
相关产品推荐
相关产品推荐

