2012-01-12 17 views
3

我想知道attrMapattrsBeautifulSoup之間的區別是什麼?更具體地說,哪些標籤有attrs,哪些有attrMapattrMap和attrs在beautifulSoup上的區別

>>> soup = BeautifulSoup.BeautifulSoup(source) 
>>> tag = soup.find(name='input') 
>>> dict(tag.attrs)['type'] 
u'text' 
>>> tag.attrMap['type'] 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
TypeError: 'NoneType' object is not subscriptable 

回答

3

attrMap字段是Tag類中的內部字段。你不應該在你的代碼中使用它。您應該改用

value = tag[key] 
tag[key] = value 

這在內部映射到tag.attrMap[key],但只有在__getitem____setitem__已確保初始化self.attrMap。這是在_getAttrMap完成的,這不是一個複雜的dict(self.attrs)調用。因此,對於您的代碼將使用

>>> url = "http://stackoverflow.com/questions/8842224/" 
>>> soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read()) 
>>> soup.find(name='input') 
>>> tag = soup.find(name='input') 
>>> tag['type'] 
u'text' 

如果要檢查一個給定的屬性是否存在等,則必須使用

try: 
    tag[key] 
    # found key 
except KeyError: 
    # key not present 

if key in dict(tag.attrs): 
    # found key 
else: 
    # key not present 

正如指出的亞當認爲,這是因爲Tag上的__contains__方法搜索內容,而不是屬性,因此更熟悉的key in tag沒有達到您所期望的效果。這種複雜性的出現是因爲BeautifulSoup處理具有重複屬性的HTML標籤。所以一個普通的地圖(字典)是不夠的,因爲可以複製密鑰。但如果你想檢查是否有任何密鑰與給定的名稱,然後key in dict(tag.attrs)將做正確的事情。

+0

好的答案。與此相關的另一個問題 - 如何知道屬性是否存在? 從上面的例子中,我可以做到 - tag.has_key('type') 但是在對代碼運行PEP8之後,它說has_key已被棄用並使用'in'代替?有什麼想法嗎?我不能做tag.keys()?! – abarik 2012-01-12 21:18:46

+0

所以:'如果「鍵入」標籤:無論()' – AdamKG 2012-01-12 21:31:41

+0

@亞當克 - 是的!但是做同樣的事情會返回False。所以「如果'鍵入'在標籤:什麼()」不起作用:( – abarik 2012-01-12 21:38:59