使用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的元素,常见原因和解决办法如下:
页面内容是JS动态渲染的
requests.get()只能获取服务器返回的初始静态HTML,很多网站会用JavaScript动态加载导航栏这类元素。如果是这种情况,改用Selenium模拟浏览器加载页面,确保所有动态内容都渲染完成后再解析。class名称有误或页面结构已更新
手动检查网页源码(F12查看Elements),确认目标元素的class是否真的是subNav_outer,可能网站更新后class名称变了,或者元素的class有多个(比如subNav_outer another-class),这时候用find(class_="subNav_outer")依然可以匹配,也可以用CSS选择器select_one(".subNav_outer")来定位。修复代码中的小错误
原代码里还有个细节: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的元素")
- 改用CSS选择器定位
用select_one()替代find(class_),有时候兼容性更好:
abclistings = soup.select_one(".subNav_outer")
内容的提问来源于stack exchange,提问作者Nicholas Cox
相关产品推荐
相关产品推荐

