python - Bs4汤输出有时是列表对象有时不是
问题描述
取决于我是否使用以下代码:
results = soup.find('div', attrs={'class':'results'})
或者
results = soup(class_='results')[0]('div', attrs={
'data-_tn' : 'companies/row'})
我在结果中存储了相同的 html 树,但后一种方法是一维数组,用逗号分隔“公司/行”div。我意识到这与问题无关(不是真正的问题),但我只是想弄清楚为什么会发生这种情况背后的 bs4。
解决方案
你给出的例子并没有做同样的事情。相比:
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
仅用于从返回的结果列表中选择第一个元素。
推荐阅读
- c# - 如何将 TimeSpan 舍入到一位数毫秒
- c++ - 指针重新分配和多态
- java - Java 中是否存在与平台无关的代码来调用默认应用程序来查看 PDF、DOCX、JPEG 等文档类型?
- android - 如何在 Android 中保存和恢复 lambda?
- mysql - SQL 替换特定“/”后的所有文本
- raku - 使用 NativeCall 将 C 库函数合并到 Perl6
- iframe - 设置 iframe 的内容安全策略?
- python - Python中1到N之间所有素数的总和
- javascript - 在以下示例中,是“
- " 一个错字还是有特殊含义?
- javascript - 反应组件,MongoDB 并传递一个键 - 类型错误:无法读取未定义的属性“_id”