从ResultSet中提取特定赛事数据的技术实现问询
解决方案
不需要把ResultSet里的td和th分开处理,直接遍历整个结果集,通过状态标记来抓取目标区间的th数据就行,以下是具体实现思路和代码示例:
核心逻辑
- 初始化一个状态标记(比如
in_target_section),初始为False - 遍历ResultSet中的每个元素:
- 如果当前元素是td,检查文本是否包含目标子串(如"MLB"):
- 包含的话,把状态标记设为
True,跳过当前td - 如果状态已经是
True(说明遇到了下一个td),直接终止遍历
- 包含的话,把状态标记设为
- 如果当前元素是th,且状态标记为
True,就把这个th的内容存入结果列表
- 如果当前元素是td,检查文本是否包含目标子串(如"MLB"):
代码示例(以BeautifulSoup的ResultSet为例)
from bs4 import BeautifulSoup # 模拟爬取得到的页面内容与ResultSet sample_html = """ <table> <tr><td>NBA</td></tr> <tr><th>10:00 湖人vs勇士</th></tr> <tr><th>11:30 快船vs太阳</th></tr> <tr><td>MLB</td></tr> <tr><th>09:00 红袜vs洋基</th></tr> <tr><th>12:00 道奇vs巨人</th></tr> <tr><td>NFL</td></tr> <tr><th>14:00 爱国者vs牛仔</th></tr> </table> """ soup = BeautifulSoup(sample_html, 'html.parser') result_set = soup.find_all(['td', 'th']) # 得到包含td和th的ResultSet target_keyword = "MLB" target_th_data = [] in_target_section = False for elem in result_set: if elem.name == 'td': if target_keyword in elem.get_text(strip=True): in_target_section = True elif in_target_section: # 遇到下一个分类td,停止抓取 break elif elem.name == 'th' and in_target_section: target_th_data.append(elem.get_text(strip=True)) print(target_th_data) # 输出: ['09:00 红袜vs洋基', '12:00 道奇vs巨人']
注意事项
- 如果页面存在多个含目标子串的td,去掉
break逻辑,改为切换状态即可抓取多段数据 - 用
get_text(strip=True)能去除文本里的多余空格和换行,让数据更整洁 - 确保ResultSet是按页面文档顺序排列的(BeautifulSoup的
find_all默认就是按顺序返回)
内容的提问来源于stack exchange,提问作者Link
相关产品推荐
相关产品推荐

