首页 > 编程问答 >使用 Python 进行 Web 抓取以获取数据 NoneType ERROR

使用 Python 进行 Web 抓取以获取数据 NoneType ERROR

时间:2024-07-28 05:56:58浏览次数:14  
标签:python web-scraping server nonetype

我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我 NoneType 错误。它可以在 google colab 上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?

网页抓取代码;

def dolar():
  headers = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15'
  url = f'https://finance.yahoo.com/quote/TRY=X/'
  r = requests.get(url)
  soup = bs(r.text, 'html.parser')
  dolar = soup.find("div", {"class": "container yf-mgkamr"}).find_all("span")[0].text
  return dolar

EROOR;

Traceback (most recent call last):
  File "/Users/user/Desktop/API/main.py", line 38, in <module>
    dolar()
  File "/Users/user/Desktop/API/main.py", line 35, in dolar
    dolar = soup.find("div", {"class": "container yf-mgkamr"}).find_all("span")[0].text
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'find_all'
(.venv) user@192 API % 

我尝试更改我的主网站,尝试使用不使用“.find_all”方法。它不会改变任何东西。


错误“AttributeError: 'NoneType' object has no attribute 'find_all'”表示你的代码中的 soup.find("div", {"class": "container yf-mgkamr"}) 部分没有返回 HTML 元素,而是返回 None 。这是因为在你的代码中使用的选择器 yf-mgkamr 找不到任何元素。

这可能是由于多种原因造成的,其中最常见的原因是:

  1. 网站结构更改: 你尝试抓取的网站的 HTML 结构可能已更改,并且使用的类名 yf-mgkamr 不再使用或有效。
  2. 反机器人措施: 雅虎财经等网站通常会实施反机器人措施来防止抓取。你可能会收到阻止你访问网站的验证码或其他机制。
  3. 动态内容: 网站上的汇率信息可能是动态加载的,这意味着在你加载初始 HTML 后才会加载。你的代码可能尝试在数据可用之前提取数据。

以下是解决此问题的几个步骤:

1. 检查网站的 HTML 源代码:

  • 打开你的浏览器,访问 https://finance.yahoo.com/quote/TRY=X/。
  • 右键单击页面并选择“查看页面源代码”或“检查”。
  • 搜索你尝试提取数据的 HTML 元素。
  • 验证你正在使用的选择器 div 和类 container yf-mgkamr 是否正确,以及是否包含目标 span 元素。

2. 使用更具体的选择器:

  • 如果你发现类名已更改,请在代码中更新它们。
  • 尝试使用更具体的选择器,该选择器不太可能因网站更新而中断。例如,你可以使用元素的 ID 或组合多个类名。

3. 处理动态内容:

  • 如果你怀疑该网站正在使用 JavaScript 动态加载内容,则可能需要使用 Selenium Playwright 等工具,这些工具可以呈现 JavaScript 并与页面进行交互,就像人类用户一样。

4. 设置用户代理:

  • 一些网站可能会阻止没有用户代理的请求。确保你正在发送一个有效的用户代理,这可以通过在 requests.get 请求中设置 headers 参数来完成。你已经这样做了,但确保它是最新的。

5. 实现错误处理:

  • 始终最好在你的代码中包含错误处理,以防找不到元素。你可以使用 try-except 块来捕获 AttributeError 并优雅地处理它。

下面是一个结合了这些更改的更新后的代码示例:

import requests
from bs4 import BeautifulSoup

def get_try_to_usd_rate():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    url = 'https://finance.yahoo.com/quote/TRY=X/'
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # 如果请求失败则引发异常
        soup = BeautifulSoup(response.content, 'html.parser')

        # 使用更具体的选择器或通过属性查找元素
        dolar_element = soup.find('fin-streamer', {'data-symbol': 'TRY=X'})
        if dolar_element:
            dolar_rate = dolar_element.text
            return dolar_rate
        else:
            print("找不到美元汇率元素。")
            return None

    except requests.exceptions.RequestException as e:
        print(f"请求错误: {e}")
        return None

if __name__ == '__main__':
    rate = get_try_to_usd_rate()
    if rate:
        print(f"TRY/USD 汇率:{rate}")

此代码包含错误处理、更新的用户代理,并尝试使用更具体的选择器查找汇率信息。调整选择器以匹配网站当前的 HTML 结构非常重要。

请记住,抓取网站可能会违反其服务条款。在抓取网站之前,请务必查看其服务条款。

标签:python,web-scraping,server,nonetype
From: 78802415

相关文章

  • Python 请求 - response.json() 未按预期工作
    我正在尝试从Python的requests模块调用API。在邮递员上,返回的响应标头中的Content-Type是application/json;charset=utf-8,响应json数据是我期望的样子。但是,在python上的API的get方法之后运行response.json()会抛出错误simplejson.errors......
  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......