You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用lxml迭代web元素时xpath提取href结果不符合预期如何解决

问题诊断

你代码的核心问题是XPath表达式的路径范围错误:
//a/@href 中的//是全局绝对定位符,不管你在哪个节点下调用xpath方法,只要路径以//开头,就会从整个HTML文档的根节点开始搜索所有<a>标签,因此每次循环都会返回全文档所有a标签的href属性组成的列表,和你预期的当前li下的内容不符。

修复方法

要限定搜索范围为当前遍历到的li节点内,把XPath改为相对路径即可,有两种常见写法:

  • 若a是li的直接子节点,使用./a/@href,.代表当前li节点,只匹配直接子级的a标签
  • 若a在li的任意嵌套层级中,使用.//a/@href,匹配当前li节点下所有层级的a标签
修正后代码
from lxml import etree
from io import StringIO

html_content ="<ul><li>...<a href='xxx'></a>...</li><li>...<a href='xxx'></a>...</li><li>...<a href='yyy'></a>...</li><li>...<a href='zzz'></a>...</li></ul>"
    
parser = etree.HTMLParser()
tree   = etree.parse(StringIO(html_content), parser)

for li in tree.iter("li"):
    # 改用相对路径限定搜索范围为当前li节点内
    url = li.xpath(".//a/@href")
    print(url)

修改后运行时每次循环只会输出当前li节点对应的href值,符合预期效果。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:15:02