Python爬取Papers with Code表格时find_all/xpath返回空的解决方法
问题根本原因
requests拿到的只是服务器返回的初始静态HTML,Papers with Code的SOTA排行榜根本不在这个初始源码里——表格数据是页面加载后由前端JS异步拉取、动态插入到DOM结构中的。静态源码里连table标签都不存在,不管用BeautifulSoup的find_all还是lxml的xpath匹配,返回空列表是必然结果。
你之前复制的xpath是浏览器中JS渲染完成后的DOM路径,和requests拿到的原始源码结构完全不匹配,自然搜不到对应节点。
可行解决方案
按需选择以下两种方案即可:
- 直接调用站点后端数据接口
排行榜数据是前端通过接口拉取的结构化JSON,不需要解析HTML,效率更高、稳定性更好。打开浏览器开发者工具的网络面板,筛选XHR/Fetch请求,就能找到加载排行榜数据的对应接口,带上正常请求头直接请求接口,就能拿到包含排名、方法名称、精度指标、论文关联信息的全量结构化数据,不需要额外做HTML节点解析。
参考实现代码:import requests # 对应3D目标检测KITTI车辆中等难度任务的接口配置 base_api = "https://paperswithcode.com/api/v1/tasks/3d-object-detection/evaluations/" req_params = { "dataset": "kitti-cars-moderate", "order_by": "-metric" } req_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } resp = requests.get(base_api, params=req_params, headers=req_headers) rank_data = resp.json() # 直接从返回的JSON结构中提取需要的字段即可 - 使用支持JS渲染的爬虫工具获取完整页面
如果不想分析接口,可以用能模拟浏览器运行、自动执行页面JS的工具,等页面把排行榜完全渲染完成后,再提取页面HTML做解析。常用工具包括Playwright、Selenium,其中Playwright配置更简单、被反爬拦截的概率更低。
参考实现代码:from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as pw: # 启动无头浏览器 browser = pw.chromium.launch(headless=True) page = browser.new_page() # 打开目标SOTA页面 page.goto("https://paperswithcode.com/sota/3d-object-detection-on-kitti-cars-moderate") # 等待排行榜表格节点加载完成 page.wait_for_selector("table") # 拿到渲染完成的完整HTML full_html = page.content() browser.close() soup = BeautifulSoup(full_html, "html.parser") # 此时可以正常匹配到表格元素 all_tables = soup.find_all("table")
爬取过程中请控制请求频率,遵守目标站点的访问规则,避免对站点正常服务造成影响。
内容的提问来源于stack exchange,提问作者qkfsbxjayiedbe
相关产品推荐
相关产品推荐

