使用Beautiful Soup抓取外汇高低价时遇NoneType问题求助
解决BeautifulSoup find返回NoneType问题,获取外汇对高低价
首先你代码里有个明显的语法错误:attrs = {'class' , 'tabMini tabQuotes'}的写法不对,应该是键值对的字典格式:attrs={'class': 'tabMini tabQuotes'},你用逗号写成集合了,BeautifulSoup无法识别这个参数。
但光改这个还不够,很多网站会拦截不带请求头的爬虫请求,你直接用requests.get(URL)返回的页面内容可能和浏览器看到的不一样,自然找不到目标元素。
下面是修正后的完整解决方案:
修正步骤
- 给请求添加浏览器UA头,模拟正常用户访问
- 按层级定位元素,先找外层容器再找子元素,提升稳定性
- 增加异常判断,避免NoneType报错
完整代码
import requests from bs4 import BeautifulSoup URL = "https://www.centralcharts.com/en/6748-aud-nzd/quotes" # 添加请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } page = requests.get(URL, headers=headers) soup = BeautifulSoup(page.content, "html.parser") # 先定位外层的tabMini-wrapper容器 wrapper = soup.find('div', class_='tabMini-wrapper') if wrapper: # 找到包含高低价的tabQuotes模块 quotes_tab = wrapper.find('span', class_='tabMini tabQuotes') if quotes_tab: # 提取高低价对应的value元素 price_items = quotes_tab.find_all('span', class_='value') if len(price_items) >= 2: high_price = price_items[0].get_text(strip=True) low_price = price_items[1].get_text(strip=True) print(f"最高价: {high_price}, 最低价: {low_price}") else: print("未找到高低价对应的元素") else: print("未找到tabQuotes模块") else: print("未找到tabMini-wrapper容器")
关键说明
- 请求头作用:
User-Agent让网站识别为浏览器访问,避免被拦截,确保返回完整的页面内容 - 层级定位:先找外层容器再找子元素,比直接定位深层元素更不容易受页面结构小变动影响
- 简化写法:用
class_='xxx'代替attrs={'class':'xxx'},代码更简洁 - 异常判断:每一步find后做存在性检查,方便排查哪一步出了问题
如果还是无法获取内容,可以先打印page.text查看返回的页面内容是否和浏览器F12看到的一致。如果不一致,可能需要处理Cookie,但这个网站加UA基本就能解决问题。
内容的提问来源于stack exchange,提问作者aclark904
相关产品推荐
相关产品推荐

