BeautifulSoup爬取网页出现NoneType无text属性错误如何解决?
错误触发原因
- 请求未携带合法请求头被站点反爬拦截,返回的页面并非正常的新闻详情页,你要定位的
content_detail容器、h1.title标题、div.date日期等元素在返回的错误页面中不存在,调用find()方法后返回None,此时直接调用.text属性就会触发该错误。 - 不同分类的页面结构存在差异:你给出的链接里第一个是视频类页面,和后两条文字新闻页的元素类名、布局逻辑不同,沿用同一套定位规则会匹配不到对应元素。
- 代码没有做非空校验,直接对
find()返回的结果链式调用.text,只要某一个元素匹配失败就会直接抛出异常中断运行。
解决办法
- 首先给请求添加模拟浏览器的请求头,优先添加
User-Agent参数,避免被反爬策略拦截:
import requests from bs4 import BeautifulSoup as bs # 示例请求头,可替换为你自己浏览器中对应请求的UA 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" } links = ['https://www.cnnindonesia.com/tv/20211101202542-407-715220/video-20-november-tiongkok-vaksinasi-anak-usia-3-11-tahun', 'https://www.cnnindonesia.com/nasional/20211101192825-32-715200/demokrat-sindir-menteri-jokowi-jadi-marketing-bisnis-pcr', 'https://www.cnnindonesia.com/nasional/20211101210153-25-715231/indonesia-distribusikan-2355-juta-dosis-vaksin-sepanjang-2021'] titles = [] news_content = [] dates = [] for link in links: # 请求时传入headers response = requests.get(link, headers=headers) # 可先打印状态码确认请求是否成功 # print(response.status_code) soup_link = bs(response.text, 'lxml') cont_dtl = soup_link.find_all('div', class_='content_detail') for cont in cont_dtl: # 元素取值前增加非空校验 title_elem = cont.find('h1', class_='title') news_title = title_elem.text.strip() if title_elem else "无标题" titles.append(news_title) date_elem = cont.find('div', class_='date') date_upload = date_elem.text.strip() if date_elem else "无日期" dates.append(date_upload) find_p = cont.find_all('p') list_paragraphs = [] for p in find_p: paragraph = p.get_text() list_paragraphs.append(paragraph) final_text = " ".join(list_paragraphs) if list_paragraphs else "无正文" news_content.append(final_text)
- 如果加了请求头后仍有匹配失败的情况,可以把
response.text保存到本地html文件,和浏览器中打开的页面源码对比,针对视频页、文字新闻页分别调整定位规则即可。
内容的提问来源于stack exchange,提问作者MrX
相关产品推荐
相关产品推荐

