【问题标题】:Xpath failed to locate the child nodes of spanXpath 找不到 span 的子节点
【发布时间】:2022-01-25 09:33:48
【问题描述】:

当我尝试使用 xpath 定位“span”时,它的工作原理是这样的。

download = new_html.xpath('//*[@id="Zoom"]/span')
print(download)

output:[<Element span at 0x7fa9370bae80>]

但是当我试图定位 span 的子节点时,它不起作用。

download = new_html.xpath('//*[@id="Zoom"]/span/a/@href')
print(download)

output: []

html结构是这样的:

<span>
    <img src="xxx" alt="xxx">
    For test.
    <br />
    For test.
    <br />
    <a target="_blank" href="abcabc">click on me.</a>   
</span>

【问题讨论】:

  • 这是一个奇怪的混合标记,img 标签没有关闭,br 标签在 XML 语法中被关闭为 &lt;br /&gt;。那么这就引出了一个问题,在尝试针对解析器构建的树运行 XPath 之前,您究竟使用哪个解析器来解析该输入?
  • 这是一个来自真实网站的例子,它使用了这种混合标记方法。那么有没有可能匹配成功呢?
  • 向我们展示解析 HTML 的代码,说明您使用的是哪个库。

标签: python html xpath


【解决方案1】:

假设 lxml 作为解析 HTML 的库,我可以使用

from lxml import etree as ET

html = '''<div id=zoom>
<span>
    <img src="xxx" alt="xxx">
    For test.
    <br />
    For test.
    <br />
    <a target="_blank" href="abcabc">click on me.</a>   
</span>
</div>
'''

doc = ET.HTML(html)

doc.xpath('//*[@id="zoom"]/span/a/@href')

结果是['abcabc']

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多