2017-07-27 108 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] 
相關問題