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

使用Beautiful Soup爬取政府网站失败,遇AttributeError报错求助

解决BeautifulSoup爬取政府网站时的AttributeError问题

这个报错我之前爬政务类网站也碰到过,本质就是name_box是None——也就是说BeautifulSoup根本没找到你指定的那个元素,自然调用.text就会炸锅。结合你说的“其他网站正常、源码里没预期结构”,大概率是这几个原因:

可能的原因

  • 动态内容渲染:很多政府网站会用JavaScript动态加载数据,你看到的页面源码是服务器初始返回的静态内容,而实际显示的元素是JS运行后生成的,所以静态源码里找不到很正常。
  • HTML结构差异:政务网站的页面架构和普通网站可能完全不同,你之前用的选择器(比如ID、类名、标签嵌套规则)在这个网站里根本不存在,导致find()返回None。
  • 反爬机制拦截:部分政府网站会检测爬虫请求,返回的内容经过篡改或者直接返回空,让你找不到目标元素。

对应的解决办法

1. 先确认真实的DOM结构

别只看页面源码,用浏览器的**开发者工具(F12)**打开Elements标签,在里面直接找你要抓取的元素——这里才是浏览器渲染后的真实DOM。找到后右键复制正确的CSS选择器或者XPath,替换你代码里的旧选择器。

2. 处理动态加载的内容

如果确定是JS渲染的内容,就得用工具模拟浏览器运行。比如用Selenium:

from selenium import webdriver
from bs4 import BeautifulSoup

# 启动浏览器(需要提前安装对应浏览器的驱动)
driver = webdriver.Chrome()
driver.get("目标政府网站URL")

# 获取渲染后的页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

# 再去查找元素
name_box = soup.find('正确的选择器')
if name_box:
    name = name_box.text.strip()
else:
    print("没找到目标元素哦")

driver.quit()

3. 给代码加异常判断

不管什么情况,都应该先检查元素是否存在,避免直接调用方法报错:

name_box = soup.find('你的选择器')
if name_box is not None:
    name = name_box.text.strip()
else:
    # 这里可以加日志或者其他处理逻辑
    print("目标元素不存在,请检查选择器或页面内容")

4. 模拟正常浏览器请求

有些网站会检查请求头,你可以给requests加上User-Agent,假装是浏览器访问:

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
response = requests.get("目标URL", headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 后续操作...

内容的提问来源于stack exchange,提问作者Ade Guntoro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:46:27