Java中用于使用XPath查询HTML的库?

6

有人能推荐一个Java库,允许我在URL上进行XPath查询吗?我已经尝试过JAXP,但没有成功。

谢谢。


请参见https://dev59.com/vmox5IYBdhLWcg3wtmc1 - 这不完全是一个重复的问题,因为它询问了特定的XPath功能,但那里有更好的答案。 - Mark Butler
@Reonarudo 我和你提问时处于同样的情况。回答中有许多可能的建议/解决方案,但我想知道你使用了哪个解决方案(库),并且它是否按照你想要的方式工作? - Uther Pendragon
@UtherPendragon 对不起,这是很久以前的事情了,我无法回忆起这是哪个项目。无论如何,现在应该有更新/更好的库可用。 - Leonardo Marques
5个回答

8

网络上有几种不同的方法可以实现这个功能:

使用HtmlCleaner

使用Jericho

我尝试了几种不同的方法,比如HtmlParser加上Java DOM解析器,以及JSoup加上Jaxen,但是表现最好的组合是HtmlCleaner加上Java DOM解析器。次好的组合是Jericho加上Jaxen。


请注意,在Android 4.2.2上,与jSoup 1.7.2相比,HtmlCleaner 2.5的速度慢了4倍。 - yanchenko
1
请注意,HtmlCleaner仅支持XPath 1.0。 - sibbl
HTML清理器 + DOM序列化器 + 线程 = 真的很糟糕的内存泄漏。 - Andrew Scott Evans

6

我不确定。它执行的是基于xpath的更简单的查询。您可以阅读一些文档,有很多很酷的例子,解释如何运行这些查询。 - Artem Barger
5
jsoup(至少版本1.7.3)不支持XPath。 - brabec
jsoup使用CSS/jQuery语法方式,这种方式与XPath相似且更好。 - phil
17
CSS 选择器并不比 XPath 更好。在 XPath 中有一些可以选择的内容,而在 CSS 选择器中则无法实现。 - Neil McGuigan
jsoup现在支持XPath和CSS选择器。自2021年9月起,在jsoup 1.14.3中实现了该功能。 - Jonathan Hedley

2
使用 Xsoup。根据文档,它比 HtmlCleaner 更快。示例
 @Test
    public void testSelect() {

        String html = "<html><div><a href='https://github.com'>github.com</a></div>" +
                "<table><tr><td>a</td><td>b</td></tr></table></html>";

        Document document = Jsoup.parse(html);

        String result = Xsoup.compile("//a/@href").evaluate(document).get();
        Assert.assertEquals("https://github.com", result);

        List<String> list = Xsoup.compile("//tr/td/text()").evaluate(document).list();
        Assert.assertEquals("a", list.get(0));
        Assert.assertEquals("b", list.get(1));
    }

链接至 Xsoup - https://github.com/code4craft/xsoup


1
你可以将TagSoup与Saxon一起使用。这样,你只需用TagSoup替换任何XML SAX解析器,XPath 2.0或XSLT 2.0或XQuery 1.0实现就像往常一样工作。

0
我使用了JTidy将HTML转换为正确的DOM,然后使用普通的XPath查询DOM。
如果您想进行跨文档/跨URL查询,最好使用带有XQuery的JTidy。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接