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

使用BeautifulSoup的find(class_)属性失败问题求助

问题描述

使用BeautifulSoup定位网页元素时,通过find(id="abcnews")能正常获取元素并执行后续操作,但调用find(class_="subNav_outer")返回空值,导致调用prettify方法触发AttributeError错误。

代码示例

import requests
from bs4 import BeautifulSoup

URL = "https://abcnews.go.com/Politics"
page = requests.get(URL)

# Testing Write to file from bs4
soup = BeautifulSoup(page.content, "html.parser")
results = soup.find(id="abcnews")
newresults = results.prettify
prettyresults = str(newresults)

abc_file = open("abc_pol.html", "wt")
n = abc_file.write(prettyresults)
abc_file.close()

# Listings

abclistings = soup.find(class_ = "subNav_outer")
newlistings = abclistings.prettify
prettylistings = str(abclistings)

abc_listings_file = open("ABC_Listings.html", "wt")
w = abc_listings_file.write(prettylistings)
abc_listings_file.close()


print(prettylistings)

报错信息

$ /home/nicholas/Documents/Dev/Py/GN/bin/python /home/nicholas/Documents/Dev/Py/GN/abcnews.py
Traceback (most recent call last):
  File "/home/nicholas/Documents/Dev/Py/GN/abcnews.py", line 20, in <module>
    newlistings = abclistings.prettify
                  ^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'prettify'
问题分析与解决方法

核心原因

find(class_="subNav_outer")返回None,说明当前获取的HTML源码里不存在这个class的元素,常见原因和解决办法如下:

  1. 页面内容是JS动态渲染的
    requests.get()只能获取服务器返回的初始静态HTML,很多网站会用JavaScript动态加载导航栏这类元素。如果是这种情况,改用Selenium模拟浏览器加载页面,确保所有动态内容都渲染完成后再解析。

  2. class名称有误或页面结构已更新
    手动检查网页源码(F12查看Elements),确认目标元素的class是否真的是subNav_outer,可能网站更新后class名称变了,或者元素的class有多个(比如subNav_outer another-class),这时候用find(class_="subNav_outer")依然可以匹配,也可以用CSS选择器select_one(".subNav_outer")来定位。

  3. 修复代码中的小错误
    原代码里还有个细节:prettify是方法,需要加括号调用(prettify()),否则拿到的是方法对象而不是格式化后的字符串。同时要增加空值判断,避免程序崩溃:

abclistings = soup.find(class_="subNav_outer")
if abclistings:
    # 调用prettify方法,注意加括号
    newlistings = abclistings.prettify()
    prettylistings = newlistings
    abc_listings_file = open("ABC_Listings.html", "wt")
    abc_listings_file.write(prettylistings)
    abc_listings_file.close()
    print(prettylistings)
else:
    print("未找到class为subNav_outer的元素")
  1. 改用CSS选择器定位
    用select_one()替代find(class_),有时候兼容性更好:
abclistings = soup.select_one(".subNav_outer")

内容的提问来源于stack exchange,提问作者Nicholas Cox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:20:16