获取所有节点的XPATH

33

有没有一个库可以为我提供HTML页面中所有节点的XPATH?


你使用的是哪种编程语言? - samplebias
1
//node() 是所有节点的 XPath。 - Steven D. Majewski
好问题,+1。请查看我的答案,其中包含详尽的解决方案。 :) - Dimitre Novatchev
@samplebias:JAVA可能更好一些,但即使是PHP或Perl我也无所谓。 - user583726
2
@Steven D. Majewski:不是。 - user357812
2个回答

53

是否有任何库可以给我HTML页面中所有节点的XPath?

是的,如果这个HTML页面是一个格式良好的XML文档。

取决于你对“节点”的理解……

//*

选择文档中的所有元素。

/descendant-or-self::node()

选择所有元素、文本节点、处理指令、注释节点和根节点 /

//text()
选取文档中的所有文本节点。
//comment()

选择文档中的所有注释节点。

//processing-instruction()

选择文档中的所有处理指令。

//@* 

选择文档中的所有属性节点。

//namespace::*

选择文档中的所有命名空间节点。

最后,您可以使用联合(|)运算符组合上述任何表达式。

因此,我认为以下表达式确实选择了任何XML文档的“所有节点”:

/descendant-or-self::node() | //@* | //namespace::*

2
“//node()”不选择根节点,因为它扩展为“/descendant-or-self::node()/child::node()”。实际上,“node()”模式不匹配文档根。 - user357812
@Alejandro:好的,已修复。至于选择文档根目录,它仍然匹配node(),如ancestor::node()self::node() - Dimitre Novatchev
抱歉,我应该说“node()作为一种模式”。 - user357812
1
刚刚发现这对Delphi很有帮助。 - user30478

2
如果这对其他人有帮助的话,如果你正在使用Python/lxml,首先需要有一个树形结构,然后使用Dimitre上面列出的XPATH路径来查询该树形结构。
获取树形结构的方法如下:
import lxml
from lxml import html, etree

your_webpage_string = "<html><head><title>test<body><h1>page title</h3>"
root = lxml.html.fromstring(your_webpage_string)
good_html = etree.tostring(root, pretty_print=True).strip()
your_tree = etree.fromstring(good_html)
all_xpaths = your_tree.xpath('//*') 

在最后一行,用你想要的任何xpath替换'//*'。现在all_xpaths是一个看起来像这样的列表:
[<Element html at 0x7ff740b24b90>,
 <Element head at 0x7ff740b24d88>,
 <Element title at 0x7ff740b24dd0>,
 <Element body at 0x7ff740b24e18>,
 <Element h1 at 0x7ff740b24e60>]

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