相关文章推荐
从容的排球  ·  Pandas之drop_duplicates ...·  1 年前    · 
绅士的冰淇淋  ·  javascript - ...·  1 年前    · 
卖萌的黄豆  ·  .NET 中的 Json ...·  1 年前    · 
率性的大熊猫  ·  Python selenium ...·  1 年前    · 

在添加.text属性时,得到一个AttributeError。

0 人关注

我已经试过下面的脚本,它工作得很好。

from bs4 import BeautifulSoup
import requests 
pr= input("search: ")
source= requests.get('https://www.flipkart.com/search?q={}&otracker=search&otracker1=search&marketplace=FLIPKART&as-show=on&as=off'.format(pr)).content
soup = BeautifulSoup(source, 'html.parser')
url= soup.find_all('div', class_=('_3O0U0u'))
whole_product_list= []
whole_url_list= []
main_product_list= []
main_url_list= []
for i in url:
    tag_a_data= i.find_all('a')
    for l in tag_a_data:
        product_list= l.find('div', class_= '_3wU53n')
        if product_list:
            main_product_list.append(product_list.text)
        else:
            product_ok= l.get('title')
            main_product_list.append(product_ok)
print(main_product_list) 

例如,如果我把 "三星 "作为输入,它会返回一个可用的属性 "div "的列表,该属性被作为参数传递,如果我把其他东西作为输入,如 "鞋子",它有 "标题 "属性,它会返回它的html中所有可用的标题列表。

But if I reverse the order, like below:

from bs4 import BeautifulSoup
import requests 
pr= input("search: ")
source= requests.get('https://www.flipkart.com/search?q={}&otracker=search&otracker1=search&marketplace=FLIPKART&as-show=on&as=off'.format(pr)).content
soup = BeautifulSoup(source, 'html.parser')
url= soup.find_all('div', class_=('_3O0U0u'))
whole_product_list= []
whole_url_list= []
main_product_list= []
main_url_list= []
for i in url:
    tag_a_data= i.find_all('a')
    for l in tag_a_data:
        product_list = l.get('title')
        if product_list:
            main_product_list.append(product_list)
        else:
            product_ok= l.find('div', class_= '_3wU53n').text
            main_product_list.append(product_ok)    
print(main_product_list)

它开始给出一个属性错误。

Traceback (most recent call last):
  File "tess.py", line 28, in <module>
    product_ok= l.find('div', class_= '_3wU53n').text
AttributeError: 'NoneType' object has no attribute 'text'

我不明白为什么第一个脚本在if-else操作的基础上可以正常工作,而第二个却不行。

4 个评论
你是否考虑过这样的可能性,即网页的源头并不总是包含一个具有该类的div?你是否期望 _3wU53n 这个名字有一些特殊的含义?
绝对不是,不会永远是这样的。
那么你就不能合理地期望 .find 它总是有一个特定的搜索目标?也许你需要想出一个更好的规则来确定你想要的div。
在尝试之前,我已经检查了其他几个相同内容的网页,它有相同的类。所以,我认为用这个类来识别是可以的。
python
python-3.x
beautifulsoup
Shivam
Shivam
发布于 2020-09-05
2 个回答
Martín Nieva
Martín Nieva
发布于 2020-09-05
已采纳
0 人赞同

In this line:

product_ok= l.find('div', class_= '_3wU53n').text

l.find('div', class_= '_3wU53n')返回None,这意味着它没有找到这个div。None的值没有得到text的属性,所以它引发了一个AttributeError的异常。

一个解决方法是使用新的海象操作员。

if product_ok := l.find('div', class_= '_3wU53n'):
    product_ok = product_ok.text
    
Arpit Omprakash
Arpit Omprakash
发布于 2020-09-05
0 人赞同

假设你为你的 "l "值收集了以下数据

  • item1 <title>title1</title><div class_= '_3wU53n'>xyz</div>
  • item2 <title>title1</title><div>xyz</div>
  • item3 <title>title1</title><div class_= '_3wU53n'>xyz</div>
  • 使用第一个代码,你的 product_list 变量将包含 item1 和 item3。然后你就可以得到所给项目的 title ,因为它们是可用的。因此,该代码的工作没有任何问题。

    使用第二个代码,你的 product_list 变量将包含 item1、item2 和 item3。但在这种情况下,你不会得到所需的 div 标签,因为它不存在于第二个项目中。这就导致了属性错误。

    简单地说,数据库中的项目总是有一个标题,但很可能不会总是有必要的 div 标签。

    下面的改动应该能让它工作。

    from bs4 import BeautifulSoup
    import requests 
    pr= input("search: ")
    source= requests.get('https://www.flipkart.com/search?q={}&otracker=search&otracker1=search&marketplace=FLIPKART&as-show=on&as=off'.format(pr)).content
    soup = BeautifulSoup(source, 'html.parser')
    url= soup.find_all('div', class_=('_3O0U0u'))
    whole_product_list= []
    whole_url_list= []
    main_product_list= []
    main_url_list= []
    for i in url:
        tag_a_data= i.find_all('a')
        for l in tag_a_data:
            product_list = l.get('title')
            if product_list:
                main_product_list.append(product_list)
            else:
                if l.find("div", class_='_3wU53n'):
                    product_ok= l.find('div', class_= '_3wU53n').text