'NoneType'对象没有属性'attrs'

时间:2019-05-11 16:10:43

标签: python web-scraping beautifulsoup

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

我尝试了try-exceptif meta is not None:,但是当我尝试运行if meta is not None: return parse_data(meta.attrs['content']) 时,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在data中显示label2,但

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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()