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

如何使用BeautifulSoup抓取votesmart平台美国政客的公开声明文本

问题排查及解决方法

核心问题定位

你当前代码触发异常的主要原因分为几类:

  • 反爬拦截:未携带浏览器请求头直接请求,网站识别到是爬虫脚本后返回拦截页面,解析的内容不是目标声明页面,自然找不到对应元素
  • 页面结构更新:你参考的教程发布时间较早,votesmart网站的页面标签类名、属性已经发生改动,原代码里的元素选择器全部失效
  • 全量异常捕获掩盖具体报错:你给scrape_speech加了无差别try-except,无法定位具体是哪一步找不到元素
  • (可选)代码缩进错误:你贴出的代码里函数下的逻辑没有正确缩进,如果实际代码也是这个格式会直接触发语法错误

具体修复步骤

  1. 首先添加请求头模拟浏览器访问,所有requests.get都携带该参数
# 全局定义请求头
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
# 所有请求改成类似格式
vs_page = requests.get(vs_url, headers=HEADERS)
speeches_page = requests.get(speeches_url, headers=HEADERS)
speech_page = requests.get(speech_url, headers=HEADERS)
  1. 临时注释异常捕获,打印具体报错信息,定位失效的元素选择器
    你可以先把scrape_speech里的try-except去掉,运行后看具体是找不到哪个元素,再对应调整选择器,比如:
  • 先打印speech_page.text确认返回的是正常页面还是拦截页面
  • 按F12打开目标声明页面的开发者工具,重新确认标题、日期、正文对应的标签和属性,替换原代码里的选择器
    举个例子,目前votesmart的声明正文容器类名已经不是main clear,可改为查找div[class*="statement-content"]这类匹配规则
  1. 如果添加请求头后还是返回拦截页面,说明网站用了Cloudflare反爬,可使用cloudscraper库代替原生requests
# 先安装依赖
pip install cloudscraper

代码里替换requests:

import cloudscraper
scraper = cloudscraper.create_scraper()
# 所有请求改成
vs_page = scraper.get(vs_url, headers=HEADERS)
  1. 修正代码缩进(如果实际代码存在该问题):Python对缩进敏感,函数内部的逻辑需要统一缩进4个空格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:06:04