为什么在BeautifulSoup中找不到功能?

时间:2018-03-10 12:34:38

标签: python beautifulsoup

我想从一个块中提取产品名称。我正在使用BeautifulSoup,问题是当我尝试从select()获取产品名称时,它返回预期的数据,当我尝试find()时,它返回none。为什么find()无效。

from bs4 import BeautifulSoup
data = '''<span id="productTitle" class="a-size-large"> Alien 3 </span>'''
soup = BeautifulSoup(data)
print(soup.select('.a-size-large')[0].text.strip())
>>> 'Alien 3'

print(soup.find('.a-size-large')) # Not working ??
>>> None

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

>>> soup.find('', {'class': 'a-size-large'})
<span class="a-size-large" id="productTitle"> Alien 3 </span>

因为您需要指定需要搜索的属性。对于第一个参数,它是空的,但您可以指定任何html元素,如:

>>> soup.find('span', {'class': 'a-size-large'})
<span class="a-size-large" id="productTitle"> Alien 3 </span>

然后它将仅搜索特定的span标签。但是留空将搜索类名等于给定的所有标签。

同时避免在搜索时使用.类名。

答案 1 :(得分:1)

select()函数需要一个CSS选择器作为参数。然而,find()函数需要标记名称和/或属性作为参数。

文档说(关于find()):

  

签名:查找(姓名,attrs,递归,字符串,** kwargs)

因此,有三种方法可以获得所需的标记:

  1. soup.select('.a-size-large')[0].text.strip()
     soup.select_one('.a-size-large').text.strip()

  2. soup.find('span', class_='a-size-large').text.strip()
    soup.find('span', {'class': 'a-size-large'}).text.strip()

  3. soup.find(class_='a-size-large').text.strip()
    soup.find(True, {'class': 'a-size-large'}).text.strip()

  4. 全部给出Alien 3作为输出。