获取所有节点的XPATH

时间:2011-04-13 01:02:11

标签: html parsing xpath

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

2 个答案:

答案 0 :(得分:37)

  

有没有可以给我的图书馆   HTML页面中所有节点的XPATH

是的,如果此HTML页面是格式正确的XML文档

取决于您对“节点”...

的理解
//*

选择文档中的所有元素。

/descendant-or-self::node()

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

//text()

选择文档中的所有文本节点。

//comment()

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

//processing-instruction()

选择文档中的所有处理说明。

//@* 

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

//namespace::*

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

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

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

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

答案 1 :(得分:1)

如果这对其他人有用,如果您使用的是python / lxml,则首先需要有一棵树,然后使用Dimitre上面列出的XPATH路径查询该树。

获取树:

import lxml
from lxml import html, etree

your_webpage_string = "<html><head><title>test<body><h1>page title</h3>"
bad_html = 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>]