【问题标题】:'NoneType' object has no attribute 'attrs' [duplicate]“NoneType”对象没有属性“attrs”[重复]
【发布时间】:2019-05-11 16:10:43
【问题描述】:

我是 python 新手。我希望这段代码在 tkinter 中运行。在我将 tkinter 添加到代码之前,它可以工作,但现在我得到一个错误:'NoneType' 对象没有属性'attrs'。我没有更改那部分代码。

我尝试了 try-exceptif meta is not None:,当我尝试 if meta is not None: return parse_data(meta.attrs['content']) code 运行但 tkinter 显示一个空标签。

entry0 = tk.Entry(frame)
entry0.grid(row = 0, column = 1)


URL = "https://www.instagram.com/{}/"

def parse_data(s):
    data ={}
    s = s.split("-")[0]
    s = s.split()
    data['Followers'] = s[0]
    data['Following'] = s[2]
    data['posts'] = s[4]
    return data

def scrape_data(username):
    r = requests.get(URL.format(username))
    s = BeautifulSoup(r.text,"html.parser")
    meta = s.find("meta",property="og:description")
    return parse_data(meta.attrs['content'])


if __name__ =="__main__": 
    username = entry0.get()
    data = scrape_data(username)


def func():
    label2 = tk.Label(frame, text = data)
    label2.grid(row = 1, column = 1)

我希望代码能够正常运行,但出现错误:“NoneType”对象没有属性“attrs”。
我希望 tkinter 在label2 中显示data 但是

【问题讨论】:

  • 大概这是因为meta = s.find("meta",property="og:description")返回None。它可能找不到您要查找的内容。我不认为tkinter 与这样的错误有任何关系。
  • 显然metaNone,所以s.find("meta",property="og:description") 失败了。 if meta is not None: 测试应该可以工作,但你没有展示你是如何应用它的。
  • @cdarke 对不起,我是 stackoverflow 的新手。我试过这样:if meta is not None: return parse_data(meta.attrs['content']) 代码运行但 tkinter 只是显示一个空白标签。
  • 这就是你所期望的,因为如果你没有明确的return,你会从函数中返回None。你期望 tkinter 展示什么?您应该确定 s.find() 失败的原因并进行处理。
  • @cdarke 我希望 tkinter 在标签中显示 data,因为没有 tkinter 的代码与 print(data) 一起使用,我使用 input 而不是 entry.get()

标签: python web-scraping beautifulsoup


【解决方案1】:

我看不到你的完整代码,但我认为你的问题是你不知道 GUI 框架是如何工作的。

首先:mainloop 启动所有内容并显示窗口。 mainloop() 之前的所有内容都在您看到窗口之前执行。

第二:Entry 不会等待您的文本,并且您的entry.get() 可能会在您看到 tkinter 的窗口之前得到空字符串。

Entry 中输入文本后,最好在窗口中添加Button 以启动您的功能。

Mainloop 显示窗口,它还会检查您是否按下按钮并执行分配给按钮的功能。它还做了很多其他的事情——从系统获取键/鼠标事件、向小部件发送事件、更新小部件中的数据、对按钮执行功能、重绘小部件和窗口等。它在您关闭窗口之前一直有效。

import requests
from bs4 import BeautifulSoup
import tkinter as tk

URL = "https://www.instagram.com/{}/"

def parse_data(s):
    data = {}
    s = s.split("-")[0]
    s = s.split()
    data['Followers'] = s[0]
    data['Following'] = s[2]
    data['posts'] = s[4]
    return data

def scrape_data(username):
    r = requests.get(URL.format(username))
    s = BeautifulSoup(r.text, "html.parser")
    meta = s.find("meta", property="og:description")
    return parse_data(meta.attrs['content'])

def on_click():
    username = entry.get()
    username = username.strip()
    if username:
        data = scrape_data(username)
        label['text'] = data
    else:
        label['text'] = "Need username"
        
if __name__ =="__main__": 

    root = tk.Tk()

    entry = tk.Entry(root)
    entry.grid(row=0, column=1)

    label = tk.Label(root)
    label.grid(row=1, column=1)
    
    button = tk.Button(root, text="Scrape", command=on_click)
    button.grid(row=2, column=1)

    root.mainloop()

编辑:2021.06.01

此代码已有 2 年历史。目前instagram 使用JavaScript 在页面上添加元素,但requestsBeautifulSoup 无法运行JavaScript。您可能需要Selenium 来控制可以运行JavaScript 的真实网络浏览器。

【讨论】:

  • 我试过你的代码。它仍然给出错误'NoneType' object has no attribute 'attrs'。您的代码中是否需要编辑某些内容?
  • @EzyGrip 此代码已有 2 年历史 - 网页可能会更改所有 HTML 几次,并且代码现在可能无法正常工作。现代页面使用 JavaScript 添加元素,但 requestsBeautifulSoup 无法运行 JavaScript。您可能需要Selenium 来控制可以运行JavaScript 的真实网络浏览器。
猜你喜欢
  • 1970-01-01
  • 2016-09-20
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 2021-05-26
  • 2022-01-25
相关资源
最近更新 更多