Web Scraping:如何提取并分类同一class的<td>元素对应数据?
解决方法
核心思路是遍历每个表格行(<tr>),通过同行的标题单元格(带review-rating-header类的<td>)来区分数据归属——每个<tr>正好对应一组标题和值,以此精准把每个review-value分到对应列表里。
完整代码示例
import requests from bs4 import BeautifulSoup # 初始化目标列表 aircraft_list = [] traveller_type_list = [] seat_type_list = [] route_list = [] date_flown_list = [] page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') article = soup.find('article') # 修正class名的空格问题,原输入的'review- ratings'为无效格式,正确class是'review-ratings' review_tables = article.find_all('table', class_='review-ratings') # 遍历每个评论表格 for table in review_tables: # 获取当前表格内的所有行 rows = table.find_all('tr') for row in rows: # 提取当前行的标题单元格和值单元格 header_td = row.find('td', class_='review-rating-header') value_td = row.find('td', class_='review-value') if not header_td or not value_td: continue # 跳过结构异常的无效行 header_text = header_td.text.strip() value_text = value_td.text.strip() # 根据标题文本匹配对应列表 if header_text == 'Aircraft': aircraft_list.append(value_text) elif header_text == 'Type Of Traveller': traveller_type_list.append(value_text) elif header_text == 'Seat Type': seat_type_list.append(value_text) elif header_text == 'Route': route_list.append(value_text) elif header_text == 'Date Flown': date_flown_list.append(value_text) # 验证输出 print("Aircraft:", aircraft_list) print("Type Of Traveller:", traveller_type_list) print("Seat Type:", seat_type_list) print("Route:", route_list) print("Date Flown:", date_flown_list)
更稳健的判断方式(基于标题的二级class)
如果担心标题文本出现大小写、翻译或格式变化,可以用标题单元格的专属标识class(比如aircraft、type_of_traveller)来判断,替换上述代码中的匹配部分即可:
# 提取标题单元格的专属标识class header_classes = header_td.get('class') identifier_class = [cls for cls in header_classes if cls != 'review-rating-header'][0] # 根据标识class匹配对应列表 if identifier_class == 'aircraft': aircraft_list.append(value_text) elif identifier_class == 'type_of_traveller': traveller_type_list.append(value_text) elif identifier_class == 'cabin_flown': seat_type_list.append(value_text) elif identifier_class == 'route': route_list.append(value_text) elif identifier_class == 'date_flown': date_flown_list.append(value_text)
关键注意点
- 原代码中
class_ = 'review- ratings'存在多余空格,会导致无法匹配表格,需修正为review-ratings。 - 按行遍历匹配的方式不受表格行顺序影响,即使页面结构调整行的排列,依然能准确分类数据。
- 加入无效行判断,避免页面结构异常时出现索引或属性报错。
内容的提问来源于stack exchange,提问作者Arek
相关产品推荐
相关产品推荐

