jsoup支持xpath吗?

33

这个主题有大量信息可供参考:https://dev59.com/q2bWa4cB1Zd3GeqPb-0r https://dev59.com/lGQo5IYBdhLWcg3wE8C2 https://dev59.com/g2bWa4cB1Zd3GeqPbN2W https://groups.google.com/forum/?fromgroups#!topic/jsoup/lj4_-EJwH1Q - Display Name is missing
4个回答

13

JSoup目前还不支持XPath,但您可以尝试XSoup——带有XPath的Jsoup。

以下是从该项目GitHub页面中引用的示例(链接):

@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支持的XPath功能和表达式列表。


(此内容在撰写时是正确的;但是现在jsoup已经支持XPath,请参见下面的答案。) - undefined

2

目前还没有,但是项目JsoupXpath已经实现了该功能。例如,

String html = "<html><body><script>console.log('aaaaa')</script><div class='test'>some body</div><div class='xiao'>Two</div></body></html>";
JXDocument underTest = JXDocument.create(html);
String xpath = "//div[contains(@class,'xiao')]/text()";
JXNode node = underTest.selNOne(xpath);
Assert.assertEquals("Two",node.asString());

顺便提一下,它支持完整的W3C XPATH 1.0标准语法。例如:

//ul[@class='subject-list']/li[./div/div/span[@class='pl']/num()>(1000+90*(2*50))][last()][1]/div/h2/allText()
//ul[@class='subject-list']/li[not(contains(self::li/div/div/span[@class='pl']//text(),'14582'))]/div/h2//text()

0
是的,jsoup现在原生支持XPath。我在2021年发布的版本1.14.3中添加了XPath支持。
例如:
  Document doc = Jsoup.connect("https://jsoup.org/").get();
  
  Elements elements = doc.selectXpath("//div[@class='col1']/p");
      // Each P element in div.col1
  
  List<TextNode> textNodes = doc.selectXpath("//a/text()", TextNode.class);
      // Each TextNode in every A element

查看XPath菜谱指南以获取更多信息。

0

HtmlUnit 支持XPath。我在某些项目中使用过它,效果还不错。


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