使用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
相关产品推荐
相关产品推荐

