Scrapy中选择器列表索引失效求助:无法遍历span选择器
嘿,我来帮你解决这个XPath索引的小坑~
首先得搞清楚你遇到问题的根源:XPath的索引写法很容易搞混。你之前用span[1]和直接写span结果一样,是因为//custom-dropdown[@id="bodytypes"]/div[2]/label/span[1]的意思是「找到所有label下的第1个span子节点」,而如果每个label里本来就只有1个span,那它和直接找所有span的结果自然完全一致;至于span[2]返回空,就是因为没有哪个label里有第2个span子节点呀。
那要正确遍历或索引所有匹配到的span元素,你需要这么做:
1. 先确认所有匹配的span集合
先执行这个表达式,看看返回的Selector列表长度:
spans = response.xpath('//custom-dropdown[@id="bodytypes"]/div[2]/label/span') print(len(spans))
如果长度大于1,说明确实有多个span元素需要处理。
2. 正确的索引方式
如果你想取第n个span(比如第2个),要把整个匹配集合用括号括起来再索引:
# 取第2个span second_span = response.xpath('(//custom-dropdown[@id="bodytypes"]/div[2]/label/span)[2]')
这种写法是先拿到所有符合条件的span组成的集合,再从中取第n个元素,这才是你想要的索引逻辑。
3. 遍历所有span的两种方法
方法一:遍历Selector列表
逐个取出每个span的文本:
spans = response.xpath('//custom-dropdown[@id="bodytypes"]/div[2]/label/span') for span in spans: # 用相对路径取文本,注意前面的点 span_text = span.xpath('.//text()').get().strip() print(span_text)
方法二:直接获取所有文本
用getall()一次性拿到所有span的文本列表,再遍历:
all_span_texts = response.xpath('//custom-dropdown[@id="bodytypes"]/div[2]/label/span/text()').getall() for text in all_span_texts: print(text.strip())
这样就能轻松遍历所有你需要的span文本啦~
内容的提问来源于stack exchange,提问作者dorinand
相关产品推荐
相关产品推荐

