我正在使用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]),为什么一个给出错误而另一个却起作用?
提前谢谢
答案 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
,而是至少一个其他元素。