使用Python和BeautifulSoup爬取表格时无法定位table标签及data-table类问题
问题排查与解决方案
根因分析
你碰到的是动态渲染类网站的典型爬取问题:
- 目标网站的2020欧洲杯球员统计表格,并非写在初始HTML源码里,是浏览器加载完基础页面后,通过JavaScript异步拉取数据、动态生成后插入到页面DOM中的
- 你当前用的urllib只能获取初始静态HTML,没有浏览器的JS执行环境,无法生成动态内容,因此解析后的soup里找不到对应table元素
可落地解决方法
方法一:使用支持JS渲染的爬取工具(入门友好)
用selenium模拟真实浏览器运行,自动执行页面JS生成完整内容,示例代码如下:
from bs4 import BeautifulSoup as soup from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置无头模式,无需弹出浏览器窗口 chrome_opt = Options() chrome_opt.add_argument("--headless=new") chrome_opt.add_argument("--disable-blink-features=AutomationControlled") target_url = "https://theanalyst.com/na/2021/06/euro-2020-player-stats" # 初始化浏览器驱动,加载页面 driver = webdriver.Chrome(options=chrome_opt) driver.get(target_url) # 等待页面渲染完成 driver.implicitly_wait(3) # 获取渲染完成后的完整HTML full_html = driver.page_source page_soup = soup(full_html, "html.parser") driver.quit() # 此时可正常定位目标table stats_table = page_soup.find("table", class_="data-table") print(stats_table)
运行前需完成依赖准备:
- 执行命令安装selenium:
pip install selenium - 本地安装Chrome浏览器,新版selenium会自动匹配对应驱动,无需手动下载
方法二:直接请求数据接口(性能更优)
打开浏览器开发者工具的「网络」面板,筛选「XHR/提取」类请求,刷新页面后找到返回球员统计数据的接口,直接请求该接口即可拿到JSON格式的原始数据,无需解析HTML,爬取效率更高。
内容的提问来源于stack exchange,提问作者Slopers Pinches
相关产品推荐
相关产品推荐

