【问题标题】:get XPATH for all the nodes获取所有节点的 XPATH
【发布时间】:2023-03-27 22:18:01
【问题描述】:

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

【问题讨论】:

  • 您使用哪种语言?
  • //node() 是所有节点的 Xpath。
  • 好问题,+1。请参阅我的答案以获取详尽的解决方案。 :)
  • @samplebias : JAVA 会更好。但我不介意它是 PHP 或 Perl。
  • @Steven D. Majewski:不。不是。

标签: html parsing xpath


【解决方案1】:

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

是的,如果此 HTML 页面是格式良好的 XML 文档

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

//*

选择文档中的所有元素。

/descendant-or-self::node()

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

//text()

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

//comment()

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

//processing-instruction()

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

//@* 

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

//namespace::*

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

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

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

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

【讨论】:

  • //node() 不选择根,因为它已扩展为 /descendant-or-self::node()/child::node()。事实上node() 模式与文档根不匹配。
  • @Alejandro:很好,已修复。至于选择文档根,它仍然匹配node(),如ancestor::node()self::node()
  • 对不起,我应该说node()作为一种模式”
  • 刚刚发现它对 Delphi 有帮助
【解决方案2】:

如果这对其他人有帮助,如果您使用的是 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>]

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多