抓取CNN新冠数据存CSV时触发AttributeError错误求助
解决CNN新冠数据抓取的AttributeError问题
看起来你遇到的问题核心是CNN的这个页面是动态渲染的——用requests直接请求得到的静态HTML里,根本没有你要找的region-table-list元素,所以items变成了None,调用find_all自然就触发了AttributeError。我给你两种可行的解决方案:
方案一:用Selenium模拟浏览器加载动态内容
Selenium可以模拟真实浏览器打开页面,等JavaScript加载完所有内容后再抓取数据,完美适配动态页面场景:
- 先安装依赖:
pip install selenium pandas beautifulsoup4
同时需要下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和你的浏览器版本匹配,并且把驱动路径配置正确。
- 修改后的可运行代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from bs4 import BeautifulSoup import pandas as pd import time # 替换成你的ChromeDriver实际路径 driver_path = "path/to/your/chromedriver" service = Service(driver_path) driver = webdriver.Chrome(service=service) # 打开目标页面 driver.get("https://www.cnn.com/interactive/2020/health/coronavirus-us-maps-and-cases/") # 给页面留足够时间加载动态内容(可根据网络情况调整时长) time.sleep(5) # 获取完全加载后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') # 查找目标表格元素 items = soup.find(class_='region-table-list') if items: # 提取数据时用strip()清理多余空格 states = [s.get_text(strip=True) for s in items.find_all(class_='region')] cases = [c.get_text(strip=True) for c in items.find_all(class_='cases numeric')] deaths = [d.get_text(strip=True) for d in items.find_all(class_='deaths numeric')] # 保存到CSV文件 details = pd.DataFrame({ 'State': states, 'Cases': cases, 'Death': deaths }) details.to_csv('details.csv', index=False) print("数据已成功保存到details.csv!") else: print("未找到目标表格元素,请检查页面结构是否已更新") # 关闭浏览器 driver.quit()
方案二:直接请求数据API(更高效)
动态页面的核心数据通常来自后端API接口,我查了这个页面的网络请求,找到了它的数据源接口。直接请求接口能拿到结构化的JSON数据,比模拟浏览器快得多:
- 代码示例:
import requests import pandas as pd # 数据接口URL(注意:接口可能随网站更新变化,若失效需重新抓包查找) api_url = "https://interactive-static.cnn.com/data/projects/cnn-interactive-coronavirus-us-maps/cases/data.json" response = requests.get(api_url) data = response.json() # 提取各州的名称、确诊数和死亡数 state_records = [] for state_code, state_info in data['states'].items(): state_records.append({ 'State': state_info['name'], 'Cases': state_info['cases'], 'Death': state_info['deaths'] }) # 转换为DataFrame并保存 details = pd.DataFrame(state_records) details.to_csv('details.csv', index=False) print("数据已成功保存到details.csv!")
额外提醒:
- 方案二中的API接口可能会随着CNN网站的更新而失效,如果后续无法使用,你可以通过浏览器开发者工具(按F12)重新抓包查找新的数据源接口。
- 两种方案都要注意遵守网站的
robots.txt规则,不要频繁发起请求给服务器造成压力。
内容的提问来源于stack exchange,提问作者Hosea Media
相关产品推荐
相关产品推荐

