Bs4汤输出有时是列表对象,有时不是

时间:2019-09-16 03:59:23

标签: python beautifulsoup

取决于我是否使用以下代码:

results = soup.find('div', attrs={'class':'results'})

results = soup(class_='results')[0]('div', attrs={
    'data-_tn' : 'companies/row'})

我在结果中存储了相同的html树,但是后一种方法是一维数组,用逗号分隔“ companies / row” div。我意识到这几乎不是问题的背景(不是真正的问题),但我只是想弄清楚为什么会发生这种情况的bs4。

1 个答案:

答案 0 :(得分:3)

您提供的示例并没有完成相同的工作。比较:

from bs4 import BeautifulSoup

html_doc = '<html>' \
           '<body>' \
           '  <div>No</div>' \
           '  <div class="results">' \
           '    <div data-_tn="companies/row">Yes</div>' \
           '  </div>' \
           '</body>' \
           '</html>'
soup = BeautifulSoup(html_doc, 'html.parser')

result = soup.find('div', attrs={'class': 'results'})
print(result)

result = soup(class_='results')[0]
print(result)

请注意,结果是相同的,每个结果都为您提供一个Tag对象。

因此,您可以通过调用它们来跟踪它们,以进一步缩小范围:

result = soup.find('div', attrs={'class': 'results'})('div', attrs={'data-_tn': 'companies/row'})
print(result)

result = soup(class_='results')[0]('div', attrs={'data-_tn': 'companies/row'})
print(result)

在这种情况下,由于只有一个匹配项,您将获得两个匹配结果的列表,仅包含一个元素。

方法.find()仅返回一个结果,而使用.find_all()将为您提供与第二种处理方法完全相同的结果:

result = soup.find_all('div', attrs={'class': 'results'})
print(result)

result = soup(class_='results')
print(result)

请注意如何从第二次调用[0]的过程中删除soup位,该位仅用于从返回的结果列表中选择第一个元素。