BeautifulSoup新手求助:'NoneType' object has no attribute 'text'错误解决
Hey there! 作为刚上手BeautifulSoup的新手,碰到这个'NoneType' object has no attribute 'text'的报错真的太常见了——本质就是你用来提取数据的那个value_box压根没找到,返回了None,你再去调用它的.text属性自然就炸了。我帮你拆解几个最可能的原因和解决办法:
问题根源与解决步骤
1. 元素选择器不对,网页结构和预期不符
很多新手会照着教程里的选择器直接用,但网站随时可能更新页面结构(比如class名、标签层级变了),导致你的find()/select_one()找不到目标元素。
解决办法:
- 打开目标页面,按F12调出开发者工具,切换到「Elements」标签。
- 用左上角的选择工具(箭头图标)点击页面上的比特币难度数值,定位到它对应的HTML元素。
- 复制正确的选择器:比如如果元素是
<span class="latest-value">12345678</span>,那代码里就用soup.find('span', class_='latest-value')或者soup.select_one('.latest-value')。
2. 请求被识别为爬虫,返回非目标页面
直接用requests.get(url)发送请求时,没有携带浏览器的请求头,网站可能会返回反爬页面、空白页或者错误页,导致BeautifulSoup解析不到内容。
解决办法:
给请求加上模拟浏览器的User-Agent头,示例代码:
import requests from bs4 import BeautifulSoup url = "https://www.quandl.com/data/BCHAIN/DIFF-Bitcoin-Difficulty" # 可以用这个通用的User-Agent,也可以替换成你自己浏览器的 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) # 先打印response.text看看返回的是不是正常页面内容,方便排查 # print(response.text) soup = BeautifulSoup(response.text, 'html.parser') # 这里替换成你找到的正确选择器 value_box = soup.find('span', class_='latest-value') if value_box: bitcoin_diff = value_box.text.strip() print(f"比特币最新难度值:{bitcoin_diff}") else: print("⚠️ 没找到目标元素!要么是选择器错了,要么是页面内容动态加载的")
3. 数据是JavaScript动态加载的,静态HTML里没有
如果上面两步都试过还是找不到,那大概率是页面的难度数值是通过JavaScript从后端接口拉取的,直接爬静态HTML根本看不到。
解决办法:
用Selenium或Playwright这类工具模拟浏览器加载页面(会执行JS),示例用Selenium:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time # 自动安装Chrome驱动并启动浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.quandl.com/data/BCHAIN/DIFF-Bitcoin-Difficulty") # 给页面一点加载时间 time.sleep(2) try: # 替换成你找到的正确元素定位方式 value_box = driver.find_element(By.CLASS_NAME, 'latest-value') bitcoin_diff = value_box.text.strip() print(f"比特币最新难度值:{bitcoin_diff}") except Exception as e: print(f"出错了:{e},可能是元素定位错了或者页面加载失败") driver.quit()
额外排查小技巧
- 先打印
response.text(或者在Selenium里用driver.page_source),看看返回的内容是不是你在浏览器里看到的页面。如果是一堆反爬提示,就得加更多请求头(比如Referer)或者换代理。 - 检查目标页面是否需要登录:有些网站的公开数据也可能需要登录才能查看,你可以手动登录后再用开发者工具看请求头里的
Cookie,加到请求里。
内容的提问来源于stack exchange,提问作者legui
相关产品推荐
相关产品推荐

