首页 > 解决方案 > AttributeError:'NoneType' 对象没有带有 for 循环的属性 'text'

问题描述

当我运行我的程序时:

import requests
from bs4 import BeautifulSoup
class Data():
    def __init__(self):
        self.tags = open("tags.txt", "r")
        self.tag = "everything"
        self.url = "https://www.amazon.com/" + self.tag
        self.headers_param = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 OPR/74.0.3911.160"}
        self.request = None
        self.soup = None
    def get_data(self):
        for i in range(6):
            self.tag = self.tags.readline()
            self.request = requests.get(self.url, headers=self.headers_param)
            self.soup = BeautifulSoup(self.request.content, "lxml")
            self.finder = self.soup.find("div", {"class":"content"}).text
            print(self.tag)
            print(self.url)
            print(self.finder)
            i += 1
data = Data()
data.get_data()

我收到此错误:

Traceback (most recent call last):
  File "D:/Projects/neo_bot/main.py", line 25, in <module>
    data.get_data()
  File "D:/Projects/neo_bot/main.py", line 19, in get_data
    self.finder = self.soup.find("div", {"class":"content"}).text
AttributeError: 'NoneType' object has no attribute 'text'

如果我删除text它效果很好,但我需要它。我无法解决我的问题。请帮我!

标签: pythonbeautifulsoup

解决方案


正如上面的评论,你有两个问题

  • get_data()不更新 URL 它将始终https://www.amazon.com/everything使您的选择器不起作用
  • .find()返回 None 如果没有找到元素所以你不能使用.text,以避免错误检查它之前

固定代码

class Data():
    def __init__(self):
        self.tags = open("tags.txt", "r")
        self.tag = "everything"
        self.url = "https://www.amazon.com/" + self.tag
        self.headers_param = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 OPR/74.0.3911.160"}
        self.request = None
        self.soup = None
    def update_url(self):
        self.tag = self.tags.readline()
        self.url = "https://www.amazon.com/" + self.tag
    def get_data(self):
        for i in range(6):
            self.update_url() # <=== update the url
            self.request = requests.get(self.url, headers=self.headers_param)
            self.soup = BeautifulSoup(self.request.content, "lxml")
            self.finder = self.soup.find("div", {"class":"content"})
            if not self.finder: # <== check for NoneType
                print('element not found')
                self.finder = 'no text'
            else:
                self.finder = self.finder.text
            print(self.tag)
            print(self.url)
            print(self.finder)
            i += 1
            
data = Data()
data.get_data()

推荐阅读