我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我 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
找不到任何元素。
这可能是由于多种原因造成的,其中最常见的原因是:
-
网站结构更改:
你尝试抓取的网站的 HTML 结构可能已更改,并且使用的类名
yf-mgkamr
不再使用或有效。 - 反机器人措施: 雅虎财经等网站通常会实施反机器人措施来防止抓取。你可能会收到阻止你访问网站的验证码或其他机制。
- 动态内容: 网站上的汇率信息可能是动态加载的,这意味着在你加载初始 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