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

使用Beautiful Soup的findAll()方法爬取网页时返回空列表的求助

问题分析与解决思路

我来帮你排查下这个问题,你的container_a为空,大概率是因为目标元素是JavaScript动态加载的,而你用的urllib只能获取页面的初始静态HTML,根本拿不到JS渲染出来的内容。

先给你拆解下问题和对应的解决办法:

1. 先确认元素是否是动态加载的

你可以手动验证:打开目标网页,右键选择「查看页面源代码」(注意不是F12里的Elements标签,那是渲染后的DOM),然后搜索fyre-comment-wrapper。如果搜不到,就说明这个评论区是页面加载完成后,通过JS动态生成或者异步请求获取的,静态HTML里根本没有这个元素,那page_soup.findAll自然找不到。

2. 用支持JS渲染的工具爬取

因为urllib+BeautifulSoup组合只能处理静态内容,所以得换用能模拟浏览器运行JS的工具,比如Selenium或者Playwright。这里给你一个Selenium的示例代码:

# 先确保你已经安装了selenium和对应浏览器的驱动(比如ChromeDriver)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup as soup

my_url = 'http://www.news.com.au/sport/afl-round-3-teams-full-lineups-and-the-best-supercoach-advice/news-story/dfbe9e0e68d445e07c9522a138a2b824'

# 配置Chrome无头模式(不想弹出浏览器窗口的话用这个)
chrome_options = Options()
chrome_options.add_argument("--headless=new")

# 初始化浏览器驱动
driver = webdriver.Chrome(options=chrome_options)
driver.get(my_url)

# 等待10秒让评论区加载完成(也可以用更精准的显式等待,比如等待元素出现)
driver.implicitly_wait(10)

# 获取渲染后的页面源代码
page_source = driver.page_source
page_soup = soup(page_source, "html.parser")

# 现在再查找目标元素
container_a = page_soup.findAll("div", {"class": "fyre-comment-wrapper"})
print(f"找到{len(container_a)}个目标元素")

# 记得关闭浏览器
driver.quit()

3. 顺便提下你代码里的小细节

  • 你把两个import写在同一行了,虽然语法没问题,但建议分开写,可读性更好:
    from urllib.request import Request, urlopen
    from bs4 import BeautifulSoup as soup
    
  • 你已经把web_byte解码成了webpage,但创建BeautifulSoup时用的还是web_byte,虽然BeautifulSoup能自动处理字节,但统一用解码后的字符串webpage更稳妥:page_soup = soup(webpage, "html.parser")

进阶优化:直接请求评论API

如果不想用浏览器模拟,你可以打开浏览器的Network标签(F12),刷新页面后筛选「XHR/Fetch」请求,找到加载评论数据的API接口,直接用requests或者urllib请求这个接口,解析返回的JSON数据。这种方式效率更高,不用等待浏览器渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:38