使用bs4爬取marketwatch.com时报NoneType错误问题咨询
BeautifulSoup爬取marketwatch.com出现NoneType错误问题解析
错误本质
你当前代码抛出NoneType错误的直接原因是:article.find('span', class_='article__timestamp')这一步返回了None,后续直接对None执行['data-est']的取值操作,违反Python语法规则就会触发报错。
找不到目标span标签的常见原因
- 部分
article__content节点结构不完整:你遍历的所有div.article__content节点里,可能混杂了广告、专题推荐、空占位模块等非标准新闻卡片,这类卡片本身就没有article__timestamp时间戳节点,自然查找失败。 - 页面内容为动态渲染:MarketWatch的部分页面内容是通过JavaScript异步加载渲染的,你直接请求页面拿到的初始HTML里并不包含动态生成的时间戳节点,BeautifulSoup只能解析静态HTML,无法识别JS插入的元素。
- 反爬机制触发:如果请求没有携带符合要求的User-Agent等请求头,网站会返回简化版页面、拦截提示页,页面结构和你预期的正常结构完全不一致,也会找不到目标节点。
- 页面结构迭代:网站可能随时更新了前端类名、节点层级,你参考的旧结构和当前线上实际结构不匹配。
修复方案
for article in soup.find_all('div', class_='article__content'): # 先查找时间戳节点 timestamp_ele = article.find('span', class_='article__timestamp') # 先判断节点是否存在,再取值 if timestamp_ele: # 用get方法取属性,哪怕属性不存在也不会报错 date = timestamp_ele.get('data-est') print(date) # 调试用:可以打印异常节点的结构,排查是哪类卡片没有时间戳 # else: # print(article.prettify())
如果确认是动态渲染导致的找不到节点,可以改用Selenium、Playwright等支持JS渲染的工具爬取,或者抓接口直接请求时间戳对应的后端接口数据。
内容的提问来源于stack exchange,提问作者user15143876
相关产品推荐
相关产品推荐

