You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeautifulSoup无法解析Article元素:获取赛事列表子元素失败求助

解决BeautifulSoup无法匹配赛事article标签的问题

看起来你在抓取赛事列表时碰到了个典型的小坑,我来帮你一步步排查解决:

1. 先修正属性匹配的语法错误

你写的matches = table.findAll("article",{"role","article"})存在关键问题:BeautifulSoup的属性匹配需要用字典格式,而不是Python集合。你当前用的{"role","article"}是集合类型,不符合BeautifulSoup的参数预期,正确写法应该是键值对形式的字典:

matches = table.findAll("article", {"role": "article"})

或者更简洁的关键字参数写法:

matches = table.findAll("article", role="article")

这大概率是导致返回空列表的核心原因,先试试这个修正,很多时候问题就出在这儿。

2. 确认目标元素的层级结构

有时候我们会想当然认为元素在某个容器内,但实际HTML结构可能和预期有差异。你可以先打印table.prettify(),查看这个accordions类的div内部结构,确认那些<article role="article">标签是不是真的直接嵌套在这个div下,还是藏在更深的子容器里。如果是后者,可能需要调整查找路径,比如先定位到子容器再查找article。

3. 排查页面是否为动态渲染

如果语法修正后还是没结果,那可能这些赛事article是通过JavaScript动态加载的。BeautifulSoup只能解析页面初始的HTML源码,无法处理JS生成的动态内容。这种情况下,你需要用能模拟浏览器渲染的工具,比如:

  • 使用selenium打开浏览器加载页面,获取渲染后的完整HTML再解析
  • 使用requests-html库,它原生支持JS渲染功能

这里给个selenium的简单示例:

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.get("你的目标网页URL")
soup = BeautifulSoup(driver.page_source, "html.parser")
table = soup.find("div", {"class": "accordions"})
matches = table.findAll("article", role="article")
driver.quit()

4. 验证初始容器是否正确获取

最后可以先确认第一步的table是否真的拿到了目标元素:打印table看看是不是None。如果是None,说明你一开始找class="accordions"的div就没成功,那后续的查找自然也会返回空列表,这时候需要检查class名是否拼写正确,或者是否存在其他属性干扰。

先从第一个语法修正开始尝试,这是最常见的问题,如果还不行再一步步排查后面的情况。

内容的提问来源于stack exchange,提问作者AndyReifman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:22:35