首页 > 解决方案 > Bs4汤输出有时是列表对象有时不是

问题描述

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

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

或者

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

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

标签: pythonbeautifulsoup

解决方案


你给出的例子并没有做同样的事情。相比:

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()只返回一个结果,而 using.find_all()会给你与第二种做事方式完全相同的结果:

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

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

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


推荐阅读