如何使用bs4直接搜索嵌套在其他div下的目标属性,无需逐层遍历DOM树
问题解答
BeautifulSoup的查找方法默认开启全局递归搜索,不需要手动逐层遍历DOM树,你可以直接从soup顶层定位目标比分元素。
实现逻辑
- 首先通过浏览器开发者工具确认比分元素的特征,比如UEFA官网的比分多为带
js-score类的span标签,或是class值包含score关键字的容器元素 - 直接调用soup的查找方法,指定对应特征即可一次性拿到所有匹配的比分元素,不需要先定位上层的matches_list节点
- 额外注意:该网站部分比分数据是前端JS动态加载的,requests直接请求拿到的静态HTML可能不包含实时数据,遇到该情况可以抓后台数据接口,或用Selenium等动态渲染工具抓取
参考代码
from datetime import date import requests from bs4 import BeautifulSoup today = date.today() d = today.strftime("%Y-%m-%d") page = requests.get("https://www.uefa.com/livescores/?date=" + d) soup = BeautifulSoup(page.content, "html.parser") # 直接全局搜索所有比分元素 scores = soup.find_all("span", class_="js-score") # 类名不固定的情况下也可以用模糊匹配,比如匹配所有class包含score的元素 # scores = soup.find_all(lambda tag: tag.get("class") and any("score" in c for c in tag.get("class"))) for score in scores: print(score.text.strip())
原理说明
find_all()方法的recursive参数默认值为True,调用时会自动遍历当前节点下的所有子孙节点,所以直接从soup根节点调用该方法就是对整个DOM树做全局搜索,完全不需要手动逐层向下查找。只要目标元素的特征足够明确,就能直接定位到。
内容的提问来源于stack exchange,提问作者David Nicoara
相关产品推荐
相关产品推荐

