Scrapy中XPath获取@href返回异常值问题求助
解决Tripadvisor餐厅链接爬取异常问题
问题分析
.b是Tripadvisor动态生成的混淆类名,页面加载后类名会变化,导致你的CSS选择器直接失效。- 你当前的XPath选中的是单条评论的跳转链接(
ShowUserReviews开头),而非餐厅主页的链接(Restaurant_Review开头)——因为路径指向了列表项内的评论预览模块,而非餐厅名称的跳转标签。
解决方案
1. 定位正确的餐厅主页链接
餐厅主页链接的a标签满足两个特征:包含在data-test="1_list_item"的列表项中,且href以/Restaurant_Review开头。可以用以下两种方式获取:
方式一:XPath
# 获取全部30个餐厅主页链接 restaurant_links = response.xpath('//div[@data-test="1_list_item"]//a[starts-with(@href, "/Restaurant_Review")]/@href').extract()
方式二:CSS选择器
# 获取全部30个餐厅主页链接 restaurant_links = response.css('div[data-test="1_list_item"] a[href^="/Restaurant_Review"]::attr(href)').extract()
2. 验证效果
以上两种方法返回的链接格式均为/Restaurant_Review-g187791-dXXXXXX-Reviews-XXXXXX-Rome_Lazio.html,完全符合你的预期。
3. 错误原因复盘
你之前的XPath路径//div[@data-test='1_list_item']/div/div[2]/div[1]/div//a/@href,实际指向了列表项里的评论预览区域,该区域的a标签是单条用户评论的跳转链接,因此拿到的是ShowUserReviews开头的地址。
额外爬取提示
Tripadvisor有反爬机制,爬取时注意:
- 在
settings.py中设置合理的DOWNLOAD_DELAY(如2-3秒) - 使用随机
User-Agent - 避免短时间内频繁请求同一页面
内容的提问来源于stack exchange,提问作者Rodolfo
相关产品推荐
相关产品推荐

