取决于我是否使用以下代码:
results = soup.find('div', attrs={'class':'results'})
或
results = soup(class_='results')[0]('div', attrs={
'data-_tn' : 'companies/row'})
我在结果中存储了相同的html树,但是后一种方法是一维数组,用逗号分隔“ companies / row” div。我意识到这几乎不是问题的背景(不是真正的问题),但我只是想弄清楚为什么会发生这种情况的bs4。
答案 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
位,该位仅用于从返回的结果列表中选择第一个元素。