目前正在进行一些关于向jsoup添加xpath支持的工作 https://github.com/jhy/jsoup/pull/80。
- 是否已经生效?
- 如何使用它?
目前正在进行一些关于向jsoup添加xpath支持的工作 https://github.com/jhy/jsoup/pull/80。
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功能和表达式列表。
目前还没有,但是项目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()
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