使用Scrapy爬取TripAdvisor时if else筛选条件无法生效求助
Scrapy餐厅评论数过滤逻辑修复方案
问题根因
- 核心错误:你将评论数转为了字符串类型后执行比较,字符串比较是按ASCII码逐位匹配的,例如
'9' >= '50'会返回True,完全不符合数值比较的预期。 - 逻辑顺序错误:你先执行大小比较,再判断值是否为None,空值会先进入比较逻辑产生错误判定。
- 细节问题:爬取到的评论数可能带有千位分隔符逗号(如
1,245),直接转整数会报错;餐厅名称用getall()会返回列表格式,不符合常规存储需求。
修复后代码
import scrapy class TripadSpider(scrapy.Spider): name = 'tripad' allowed_domains = ['www.tripadvisor.in'] start_urls = ['https://www.tripadvisor.in/Restaurants-g304554-c33-Mumbai_Maharashtra.html'] def parse(self, response): for item in response.xpath("//div[@class='_2Q7zqOgW Vt o']"): # 获取评论数原始值 review_count_str = item.xpath(".//span[@class='w726Ki5B']/text()").get() # 先过滤空值 if not review_count_str: continue # 处理千位分隔符,转成整数 try: review_count = int(review_count_str.replace(',', '')) except ValueError: continue # 数值比较过滤评论数大于50的餐厅 if review_count > 50: # 拼接餐厅名称多段文本,返回字符串 title = ''.join(item.xpath(".//a[@class='_15_ydu6b S5 H4 Cj b']/text()").getall()).strip() yield { 'title': title, 'review_count': review_count } next_page = response.xpath("//a[@class='nav next rndBtn ui_button primary taLnk']/@href").get() if next_page: # 用Scrapy内置follow方法自动拼接域名,无需手动拼接 yield response.follow(next_page, callback=self.parse)
关键修改说明
- 调整了逻辑顺序,先做空值判断再做数据转换
- 去掉了手动域名拼接逻辑,改用Scrapy原生的
response.follow方法处理分页,稳定性更高 - 新增了异常捕获逻辑,避免评论数格式异常导致爬虫中断
- 统一了数据格式,餐厅名称返回字符串,评论数返回整数,方便后续数据处理
内容的提问来源于stack exchange,提问作者Iswar Chand
相关产品推荐
相关产品推荐

