如何爬取Skytrax网站座椅舒适度的span标签星级评分?
解决方案
首先,分析目标HTML结构:每个评分项(如座椅舒适度)对应一个包含标签和星级的表格行,星级所在的<td>类为review-rating-stars stars,其中填充的星星是带有fill类的<span>标签,统计这类标签的数量就是对应星级。
修改代码获取座椅舒适度星级
在循环中替换seat_comfort相关代码,按以下逻辑实现:
- 精准定位标注"Seat Comfort"的表格单元格
- 获取其相邻的星级单元格
- 统计其中带
fill类的<span>标签数量
修改后的完整代码片段:
url = "https://www.airlinequality.com/airline-reviews/british-airways/page/1/" r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') reviews = soup.find_all('article', class_="comp_media-review-rated") for item in reviews: title = item.find('h2', class_="text_header").text.strip() meta = item.find('h3', class_="text_sub_header").text.strip() main_review = item.find("div", class_="text_content").text.strip() # 基础信息获取保持不变 aircraft = item.find_all('td', class_="review-value")[0].text traveller_type = item.find_all('td', class_="review-value")[1].text seat_type = item.find_all('td', class_="review-value")[2].text route = item.find_all('td', class_="review-value")[3].text travel_date = item.find_all('td', class_="review-value")[4].text # 获取座椅舒适度星级(带异常处理,避免无评分时报错) try: seat_comfort_label = item.find('td', string='Seat Comfort') seat_comfort_stars = seat_comfort_label.find_next_sibling('td', class_='review-rating-stars stars') seat_comfort = len(seat_comfort_stars.find_all('span', class_='fill')) except AttributeError: seat_comfort = None # 无此项评分时设为默认值 # 其他评分项可按相同逻辑实现,以客舱服务为例 try: cabin_staff_label = item.find('td', string='Cabin Staff Service') cabin_staff_stars = cabin_staff_label.find_next_sibling('td', class_='review-rating-stars stars') cabin_staff_service = len(cabin_staff_stars.find_all('span', class_='fill')) except AttributeError: cabin_staff_service = None # 其余评分项(餐饮、机上娱乐、地面服务等)同理替换标签文本即可 # ... # 示例输出 print(f"标题: {title}\n座椅舒适度星级: {seat_comfort}\n客舱服务星级: {cabin_staff_service}\n")
关键说明
- 用
find('td', string='Seat Comfort')精准定位评分项,避免原代码依赖固定索引的风险(页面结构变动会导致索引失效) - 加入
try-except处理评论缺失某项评分的情况,保证代码稳定运行 - 其他评分项可完全复用该逻辑,只需替换标签文本(如
'Food & Beverages'、'Inflight Entertainment'等)
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

