Scrapy中XPath提取节点内href失效仅CSS选择器可用是什么原因
核心问题根因
你遇到的XPath失效问题本质是XPath路径的相对/绝对规则混淆,和CSS选择器的默认查询范围不一致导致的,具体逻辑如下:
- XPath中以
//开头的查询规则,无论你在哪个子选择器(也就是你这里的tmpSEC[0])上调用,默认都会从整个HTML文档的根节点开始全局搜索,所以你拿到的是整个页面第一个<a>标签的href属性,刚好这个值就是/。 - 而CSS选择器默认的查询范围就是当前子选择器的后代节点,所以你调用
tmpSEC[0].css("a::attr(href)")的时候,只会在第一个section节点的后代里找<a>标签,自然能拿到正确结果。
正确的XPath写法
如果要在当前子选择器的后代范围内查询,需要在//前加.代表当前节点:
# 取当前section下所有a标签的href,拿第一个匹配结果 tmpSEC[0].xpath(".//a/@href").get() # 明确取当前section下第一个a标签的href tmpSEC[0].xpath("(.//a)[1]/@href").get()
以上两种写法就能拿到和CSS选择器一致的结果。
额外代码修正建议
你提供的爬虫代码里还有两处配置错误,后续运行也会出问题,可以提前修正:
allowed_domains只需要填写域名,不需要带协议、路径,正确写法:allowed_domains = ['tripadvisor.co.uk']start_urls多了冗余的http://前缀,正确写法:start_urls = ['https://www.tripadvisor.co.uk/Attractions-g186216-Activities-c48-a_allAttractions.true-United_Kingdom.html']
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

