使用Beautiful Soup爬虫时遭遇NoneType属性错误求助
解决爬取Money-Control新闻时的AttributeError问题
错误原因
触发AttributeError: 'NoneType' object has no attribute 'text'的核心原因是:代码中link.find("strong")或link.find(class_="PT3 a_10dgry")未找到目标元素,返回了None,直接调用.text属性就会报错。常见诱因包括:
- 目标网页结构更新,原有的标签/类名已失效
- 部分新闻条目缺失指定元素(存在异常条目)
- 反爬机制导致请求未返回正常页面内容
解决方案
1. 安全访问元素属性
先判断元素是否存在,再获取文本,避免直接调用.text:
for link in data_array_tcs: # 处理标题 title_elem = link.find("strong") title_all = title_elem.text if title_elem else "无标题" # 处理日期(同理) date_elem = link.find(class_="PT3 a_10dgry") date_all = date_elem.text if date_elem else "无日期" # 后续处理逻辑
2. 验证并更新选择器
手动打开Money-Control目标页面,右键「检查」元素,确认:
- 新闻标题是否仍在
<strong>标签内 - 日期元素的类名是否还是
PT3 a_10dgry
若网页结构已变更,需同步修改代码中的选择器(比如换成新的标签、类名或CSS选择器)。
3. 应对反爬机制
财经网站普遍存在反爬,可通过以下方式优化请求:
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/120.0.0.0 Safari/537.36" } # 带请求头发起请求 response = requests.get("你的目标新闻列表URL", headers=headers) soup = BeautifulSoup(response.text, "html.parser")
若页面为动态加载(滚动才加载更多内容),需使用Selenium/Playwright等工具模拟浏览器渲染。
4. 调试定位异常条目
通过打印输出定位具体哪条数据出问题:
for idx, link in enumerate(data_array_tcs): print(f"处理第{idx+1}条数据") print(f"当前条目HTML:\n{link.prettify()}") # 打印条目完整HTML title_elem = link.find("strong") if not title_elem: print("⚠️ 未找到标题元素,跳过该条目") continue # 后续处理
内容的提问来源于stack exchange,提问作者Renju varghese
相关产品推荐
相关产品推荐

