我正在浏览一个从网页上抓取列表数据的教程,我们有一个名为'soup'的BeautifulSoup对象,我应该找到'汤'中的所有元素,这样它们就在一个表中,元素是在某些课程中他们这样做了:
> [t["class"] for t in soup.find_all("table") if t.get("class")]
所以我在这里不明白两件事,t["class"]
在这里做什么为什么我们不简单地写t
因为if条件适用于右边为什么我们需要做首先是t["class"]
。
为什么我们在这种情况下使用.get()方法作为布尔值,我的意思是它不会返回为字典中的键存储的值吗?
这是否意味着美丽的汤对象是字典?
答案 0 :(得分:2)
“在这里做什么t [”class“]为什么我们不简单地写t”*
显然是因为作者想要检索标记的class
属性,而不是完整标记。
为什么我们在这种情况下使用.get()方法作为布尔值,我的意思是它不会返回为字典中的键存储的值吗?
dict.get(key[, default=None])
确实会返回键key
的值(如果已设置)或default
(默认为None
)(如果不是)。
这里的目标很明显只有class
才能获得标签。
这是否意味着美丽的汤对象是字典?
这里't'不是“美丽的汤对象”,它是一个Tag
实例。虽然不是严格意义上的dict
,但它确实表现为一个wrt / html属性。记录为FWIW。
答案 1 :(得分:1)
dict.get
会返回与其给定的密钥相关联的值,或None
。举个例子:
>>> foo = {'spam': 'eggs'}
>>> foo.get('spam')
'eggs'
>>> foo['spam']
'eggs'
>>> foo.get('bar')
None
>>> foo['bar']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'bar'
我不熟悉BeautifulSoup,所以在这种情况下可能需要做这样的事情,但通常你只需要检查会员资格,包括
[t['class'] for t in soup.find_all('table') if 'class' in t]
或者更少在选择器中使用dict.get
并在之后过滤掉None
个对象
tmp = [t.get('class') for t in soup.find_all('table')]
result = filter(tmp, None)
# this is equivalent to:
# result = [v for v in tmp if v]
答案 2 :(得分:0)
是您教程的一个示例,您可能无法获取文本,而不是课程
我将把列表理解写成&#34;对于&#34;格式:
result = []
tables = soup.find_all("table")
for t in tables:
if t.get("class"): #Check if tables have class attribute
result.append(t["class"]) #Probably you don't wan't the class name of the table, maybe you wan't the text