2012-09-23 56 views
2

我正在嘗試使用beautifulsoup獲取維基百科中的人的生日。例如用於http://en.wikipedia.org/wiki/Ezra_Taft_Benson的生日是8月4日,1899年去了BDAY,我使用下面的代碼:班級屬性的多個值

bday = url.find("span", class_="bday") 

但是它拿起其中bday出現在HTML代碼的另一部分實例標籤。即<span class="bday dtstart published updated">1985-11-10 </span>

有沒有辦法將確切的類標記與bday相匹配?

我希望問題是明確的,因爲目前我得到的bday是1985-11-10這不是正確的日期。

回答

4

當BeautifulSoup的所有其它匹配的方法失敗,你可以使用函數取一個參數(標籤):

>>> url.find(lambda tag: tag.name == 'span' and tag.get('class', []) == ['bday']) 
<span class="bday">1899-08-04</span> 

用於span標籤,它的類屬性是一個單一的元素(「BDAY」)的列表上述搜索。

+0

的價值,這是一個偉大的簡單的解決方案!謝謝。什麼是lambda標籤在做什麼? – user1496289

+0

'lambda'用單個參數(標籤)創建一個匿名函數。您可以定義一個單獨的命名函數並將其名稱傳遞給'find()',但簡而言之,一次性函數'lambda' [更可取](http://stackoverflow.com/a/890188/12320 )。 – efotinis

0

嘗試使用lxmlbeautifulsoup解析器。下面發現<span>標籤只與bday類(在本頁面的情況下,只有一個):

>>> from lxml.html.soupparser import fromstring 
>>> root = fromstring(open('Ezra_Taft_Benson')) 
>>> span_bday_nodes = root.findall('.//span[@class="bday"]') 
[<Element span at 0x1be9290>] 
>>> span_bday_node[0].text 
'1899-08-04' 
1

我會去這樣理解:

import urllib 
from BeautifulSoup import BeautifulSoup 

url = 'http://en.wikipedia.org/wiki/Ezra_Taft_Benson' 
file_pointer = urllib.urlopen(url) 
html_object = BeautifulSoup(file_pointer) 

bday = html_object('span',{'class':'bday'})[0].contents[0] 

這將返回1899-08-04bday

+2

這也適用於我。 –