使用BeautifulSoup爬取Yelp点评导出CSV缺失评分与ID求助
问题定位与修复说明
核心问题汇总
- 导出CSV的逻辑仅遍历了
review列表写入,完全未处理已经收集到的rating、ID两个列表的数据,是最直接的缺失原因 - 分页URL拼接错误:Yelp点评分页参数为
start,你当前的拼接逻辑没有带参数名,无法正确获取第2-10页的点评数据 - 评分选择器逻辑错误:你使用的class包含固定的星级后缀
i-stars--regular-5,只能匹配5星点评,且评分存储在aria-label属性中,不是标签的text内容,你写的i.text拿不到任何值 - 点评ID的选择器匹配错误:你当前选择的span类名并不是点评ID所在的父级容器,无法正确获取到
aria-label属性的内容 - 代码存在语法隐患:你在初始化
ID = []之前就执行了ID.append()操作,运行时会直接抛出变量未定义的报错
修正后的代码示例
from bs4 import BeautifulSoup import urllib.request import csv import time # 提前初始化三个存储列表 review_list = [] rating_list = [] id_list = [] # 循环爬10页,每页10条共100条 for page in range(0, 10): # 修正分页参数,Yelp分页用start参数,每页偏移10 url = f"https://www.yelp.com/biz/ichiran-times-square-new-york-4?osq=Ichiban+Ramen&start={page*10}" ourUrl = urllib.request.urlopen(url) soup = BeautifulSoup(ourUrl, 'html.parser') # 修正评分选择器:去掉固定星级后缀,从aria-label取星级 for rate_tag in soup.find_all('div', class_=lambda x: x and 'i-stars__373c0' in x and 'i-stars--regular' in x): rating = rate_tag.get('aria-label', '').replace(' star rating', '') rating_list.append(rating) # 修正点评ID选择器,匹配点评卡片容器获取ID for review_card in soup.find_all('div', class_=lambda x: x and 'review__373c0' in x): review_id = review_card.get('id', '') id_list.append(review_id) # 原点评内容逻辑基本可用,保留 for review_tag in soup.find_all('p', {'class':"comment__373c0__Nsutg css-n6i4z7"}): review_list.append(review_tag.text.strip()) # 加请求间隔避免触发反爬 time.sleep(3) # 导出CSV,同时写入三个字段,用csv模块避免内容逗号导致的列偏移 with open('Review.csv', 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f) # 先写表头 writer.writerow(['点评ID', '点评评分', '点评内容']) # 按行写入三个字段对应的值 for rid, rate, content in zip(id_list, rating_list, review_list): writer.writerow([rid, rate, content])
补充注意事项
- Yelp有反爬机制,若出现请求失败的情况,可以尝试添加请求头模拟浏览器访问
- 平台的类名会定期更新,若后续爬取不到数据可以重新审查元素获取最新的类名规则
内容的提问来源于stack exchange,提问作者WutsKraken
相关产品推荐
相关产品推荐

