使用Python+Beautiful Soup做网页爬虫无输出也无报错如何解决?
问题原因
- 你初始化
BeautifulSoup时没有指定解析器,不同运行环境的默认解析器存在差异,可能会导致HTML结构解析异常,但这不是无输出的核心原因。 - 核心问题是你抓取的站点内容是客户端JavaScript动态渲染生成的:
requests.get只能拿到页面初始的静态HTML骨架,你要提取的state-name fadeInUp类的div元素,是页面加载完成后JS异步请求数据后才插入到DOM里的,原始静态HTML里根本不存在这些元素,所以find_all返回空列表,运行后只会打印空的[],不会抛出任何报错。
你可以先运行以下代码验证这个结论:
from bs4 import BeautifulSoup import requests html_file = requests.get('https://www.covid19india.org').text # 检查目标类名是否存在于原始静态HTML中 print('state-name' in html_file)
运行后输出会是False,直接证明原始页面没有你要找的元素。
解决方法
方法1:请求站点数据接口(优先推荐)
这类数据展示类站点一般都会有专门的后端接口返回结构化数据,你可以直接通过浏览器开发者工具的网络面板,筛选XHR/ Fetch类型的请求,找到返回各州疫情数据的接口,直接用requests请求该接口,解析返回的JSON数据即可,效率远高于解析HTML页面。
方法2:使用模拟浏览器工具获取渲染后页面
如果你确实需要解析页面DOM结构,可以使用Selenium、Playwright这类支持运行浏览器JS的工具,等待页面完全加载后再提取内容,示例代码如下:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time # 启动Chrome浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get('https://www.covid19india.org') # 等待页面加载完成,也可以使用显式等待提升稳定性 time.sleep(3) # 获取渲染完成后的页面源码 rendered_html = driver.page_source soup = BeautifulSoup(rendered_html, 'lxml') states = soup.find_all('div',class_='state-name fadeInUp') print(states) # 关闭浏览器 driver.quit()
运行前需要先安装依赖:pip install selenium webdriver-manager beautifulsoup4 lxml requests
内容的提问来源于stack exchange,提问作者Rishikesh Gunjal
相关产品推荐
相关产品推荐

