使用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
相关产品推荐
相关产品推荐

