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

抓取CNN新冠数据存CSV时触发AttributeError错误求助

解决CNN新冠数据抓取的AttributeError问题

看起来你遇到的问题核心是CNN的这个页面是动态渲染的——用requests直接请求得到的静态HTML里,根本没有你要找的region-table-list元素,所以items变成了None,调用find_all自然就触发了AttributeError。我给你两种可行的解决方案:

方案一:用Selenium模拟浏览器加载动态内容

Selenium可以模拟真实浏览器打开页面,等JavaScript加载完所有内容后再抓取数据,完美适配动态页面场景:

  1. 先安装依赖:
pip install selenium pandas beautifulsoup4

同时需要下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动版本和你的浏览器版本匹配,并且把驱动路径配置正确。

  1. 修改后的可运行代码:
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数据,比模拟浏览器快得多:

  1. 代码示例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:47:40