使用BeautifulSoup抓取同类元素:Flashscore比赛统计数据抓取问题
Flashscore比赛统计数据抓取修正方案
原代码问题梳理
- 语法错误:第三行误用未定义的
_ap变量调用find方法,不存在的变量会直接抛出运行异常 - 定位逻辑错误:用
text='Ball Possession'匹配到的是统计项名称的独立子元素,该元素本身不包含主客场控球率的数值节点,需要先向上定位到当前统计项的整行父容器,再从父容器中查找数值节点 - 匹配规则鲁棒性不足:全字匹配文本容易受页面空白字符、前后隐藏符号的影响,导致匹配失败
修正后可运行代码
import re # 先匹配包含Ball Possession文本的元素,再向上找统计行的父容器 _bp_item = soup.find('div', string=re.compile('Ball Possession')) # 向上查找最近的整行统计容器,可根据实际页面结构调整匹配的类名规则 _stat_row = _bp_item.find_parent('div', class_=re.compile('statRow')) # 从整行容器中分别查找主客场数值 _hp = _stat_row.find('div', class_=re.compile('homeValue')).text.strip() _ap = _stat_row.find('div', class_=re.compile('awayValue')).text.strip()
可选优化点
- 如果页面类名是动态生成的,可以通过相邻节点、元素顺序定位数值,不需要依赖类名
- 若页面是异步渲染的数据,需要先通过接口请求获取数据,或者用Selenium等工具等待页面渲染完成再解析,否则soup获取不到对应元素
内容的提问来源于stack exchange,提问作者luka
相关产品推荐
相关产品推荐

