什么是python .get()方法在这种情况下做什么?

时间:2017-07-27 06:58:28

标签: python dictionary beautifulsoup

我正在浏览一个从网页上抓取列表数据的教程,我们有一个名为'soup'的BeautifulSoup对象,我应该找到'汤'中的所有元素,这样它们就在一个表中,元素是在某些课程中他们这样做了:

> [t["class"] for t in soup.find_all("table") if t.get("class")]

所以我在这里不明白两件事,t["class"]在这里做什么为什么我们不简单地写t因为if条件适用于右边为什么我们需要做首先是t["class"]

为什么我们在这种情况下使用.get()方法作为布尔值,我的意思是它不会返回为字典中的键存储的值吗?

这是否意味着美丽的汤对象是字典?

3 个答案:

答案 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