BeautifulSoup-“ NoneType”对象没有属性“ getText”

时间:2018-12-20 22:02:43

标签: python beautifulsoup

我正在使用BeautifulSoup来获取二手Iphone7智能手机的价格信息。在使用bs4库获取相关的html并使用BeautifulSoup创建一个名为“ soup”的对象之后,我使用以下代码搜索每种产品的信息:

soup = BeautifulSoup(html,'html5lib')
products = soup.find_all('div', class_='feed-item sc-gqjmRU igneJk')

这确实为我提供了有关每种产品的正确html信息。现在我更深入地了解每种产品的描述:

descriptions = [x.find('p', class_='sc-kAzzGY kZncUf') for x in products]

上面给出的代码可以正常工作。但是,这不是我想要的描述。这是我正在寻找的一种相当粗糙的形式。为了只获得我提到的描述,我需要编写类似以下内容(需要添加.getText()):

descriptions = [x.find('p', class_='sc-kAzzGY kZncUf').getText() for x in products]

这给了我以下错误:

  

----> 1个描述= [x.find('p',class _ ='sc-kAzzGY kZncUf')。getText()for x in products]

     

AttributeError:'NoneType'对象没有属性'getText'

但是,下面的代码可以正常工作:

descriptions = [x.find('p', class_='sc-kAzzGY kZncUf') for x in products]
descriptions[0].getText()

descriptions [0]应该与我们从第一次迭代得到的x.find('p',class _ ='sc-kAzzGY kZncUf')的值相同。

我的问题是:由于它们应该赋予相同的值(x.find和description [0]),为什么一个给出错误而另一个却起作用?

提前谢谢

2 个答案:

答案 0 :(得分:2)

这仅表示其中一种产品不具有符合.find('p', class_='sc-kAzzGY kZncUf')搜索条件的元素。

您可以添加此额外的检查并执行以下操作:

for product in products:
    description_element = product.find('p', class_='sc-kAzzGY kZncUf')
    description = description_element.get_text() if description_element else "No Description"

    print(description)

答案 1 :(得分:1)

运行descriptions = [x.find('p', class_='sc-kAzzGY kZncUf').getText() for x in products]时,它将在getText()的每个实例上使用x.find('p', class_='sc-kAzzGY kZncUf')。对于整个迭代不起作用,只需要做None其中之一即可。当您将descriptions列表创建为descriptions = [x.find('p', class_='sc-kAzzGY kZncUf') for x in products]时,该列表中有多个元素,其中第一个不是None,而是至少一个其他元素。