【问题标题】:AttributeError: 'NoneType' object has no attribute 'find' (Cryptocurrency Web Scraper)AttributeError: 'NoneType' 对象没有属性 'find' (Cryptocurrency Web Scraper)
【发布时间】:2022-01-12 03:02:09
【问题描述】:

使用加密货币小部件实时抓取特定加密货币价格的 html,但遇到 AttributeError: 'NoneType' object has no attribute 'find'。

这个问题突然发生了,我真的很困惑为什么它没有早点出现。在此之前,我已经多次运行代码,完全没有问题。所以我的两个问题是......

为什么会突然发生这种情况?

我该如何解决这个问题?

from tkinter import *
import requests
from bs4 import BeautifulSoup
from tkinter.ttk import *
from time import strftime


def get_crypto_price(coin):
    url = "https://www.google.com/search?q=" + coin + "+price"  # Defining link to coin
    HTML = requests.get(url)  # Requesting link access
    soup = BeautifulSoup(HTML.text, 'html.parser')  # Parser
    text = soup.find("div", attrs={'class': 'BNeawe iBp4i AP7Wnd'}).find("div",
                                                                         attrs={
                                                                             'class': 'BNeawe iBp4i AP7Wnd'}).text  # HTML Scrubber
    return coin + ': ' + text + '  |  '


root = Tk()
root.title('Crypto Widget 2021')
root.geometry('1080x40')
lab = Label(root)
lab.pack()


def update():
    lab['text'] = get_crypto_price("Bitcoin") + get_crypto_price("Ethereum") + get_crypto_price(
        "Litecoin") + get_crypto_price("Dogecoin")
    lab.after(5000, update)


update()


def time():
    string = strftime('%H:%M %p')
    lbl.config(text=string)
    lbl.after(5000, time)


lbl = Label(root, font=('times new roman', 10, 'bold'),
            background='white',
            foreground='black')
lbl.pack(anchor='n')
time()
root.mainloop()

【问题讨论】:

  • 如果不添加堆栈跟踪,我们真的无法提供帮助。请添加实际的堆栈跟踪,以便我们进行调试
  • 该站点可能已更新 - 因此,通过 'attrs={'class': '''} 访问的类名已更改。
  • 我将如何重新发现类名?我尝试在 html 中搜索新的 div 类,但没有找到任何可行的方法。

标签: python attributeerror


【解决方案1】:

看起来你的错误来自第 12 行,你不小心将一些代码翻了一番......

我运行它,但没有收到您看到的错误。但是,一般来说,您将一个查找放在另一个查找之上,您可以避免错误但将其分解为多个阶段,而不是仅仅假设第一个查找总是成功。

所以,粗略地说,而不是说:

text = soup.find(blah blah blah).find(blah blah blah).text

把它分成几个阶段:

text1 = soup.find(blah blah blah)
if text1:
    text2 = text1.find(blah blah blah...)

等等。

或者,您可以将所有内容放入一个 try-except 块中,但我更喜欢将其分解以查看第一次失败发生的位置...

【讨论】:

    【解决方案2】:

    鉴于您在 find 函数 (BNeawe iBp4i AP7Wnd) 中使用的类,我假设它们使用的是已编译的作用域类。因此,如果他们发布了新版本的网站,则您元素的 CSS 类可能已更改。

    您最近是否访问过该网站并检查了 DOM(使用控制台)以查看这些元素是否仍然存在?

    【讨论】:

    • 确实检查了它不再存在的 DOM。我将如何进行?此外,为了进一步澄清,这是我创建此刮板所遵循的指南。 betterprogramming.pub/… 需要注意的是,我试图用我找到的新 div 类替换旧类。仍然收到相同的 AttributeError 消息。
    • 好吧,你打开你的浏览器,进入你想报废的页面,使用 F12 键打开控制台,然后使用 INSPECT 选项卡,你可以看到页面的 HTML。这样你就可以找到元素的 ID 和 CLASSES,然后你就可以用你的抓取工具找到它们了
    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 2016-05-06
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多