2017-07-27 69 views
2

我正在浏览从网页上刮取清单数据的教程,并且我们有一个名为'soup'的BeautifulSoup对象,我应该从'soup'中找到所有元素,使它们在表中并且元素位于一些类,所以他们这样做:什么是python .get()方法在这种情况下正在做什么?

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

,所以我不明白这里两件事情,什么是t["class"]在这里做什么,为什么,因为如果是在为什么我们正确的应用条件不是我们干脆写t首先需要做t["class"]

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

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

回答

2

“什么是T [”阶级“在这里做什么我们为什么不干脆写T” *

显然是因为笔者想取回class属性标签的,不完整标签。

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

dict.get(key[, default=None])确实返回,如果它的设置键keydefault值(默认为None),如果它不是。

这里的目标显然是只有得到class标签有一个。

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

这里“T”是不是“美丽的汤对象,这是一个Tag实例。虽然不是严格意义是一个dict,它表现为一个WRT/HTML的确属性,这可以证明FWIW。

+0

因为我们已经在做't [“class”]',它基本上是检索标签的'class'属性,为什么我们最后需要使用'if t.get(“class”)'? – ash

+0

对于没有“class”属性的标签,'t ['class“]'会产生一个'KeyError' - 但是由于之前的条件被取消了,所以它保护我们免于此('t [”class“]将不会如果't.get(“class”)'返回一个falsy值,则执行)。请参阅Adam Smith的答案以获得相同结果的替代方法。 –

0

是您的教程的例子,你可能wan't来获取文本,而不是类

我会写列表compreheision作为“为”格式:

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 
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] 
相关问题