Python中访问XPath返回的选择器数组 始终获取第一个元素问题
问题原因
在子选择器下使用//开头的XPath路径时,默认从整个文档的根节点开始检索,不会限定在当前选中的节点范围内,因此每次调用.xpath()方法都会返回全文档第一个匹配的结果,和当前遍历到的节点无关。
解决方法
在XPath路径开头加.,明确限定检索范围为当前节点的子节点,正确的遍历代码如下:
# 拉取所有店铺节点到数组中 selectors = response.xpath('//div[@class="shop"]') # 遍历所有节点 for selector in selectors: href = selector.xpath('.//a[@class="name"]/@href').extract_first() # 后续业务逻辑
查询结果不一致说明
你测试的两个查询结果不匹配的原因:
- 执行
selectors[7].xpath('//a[@class="name"]/@href').extract_first()时,//忽略了当前第8个shop节点的上下文,直接返回全文档第一个匹配的a标签属性 - 执行
response.xpath('//div[@class="shop"][8]//a[@class="name"]/@href').extract_first()时,XPath路径本身限定了先匹配第8个shop节点再检索子节点,因此可以得到对应节点的正确结果
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

