2013-06-20 152 views
2

我正在使用BeautifulSoup編寫解析腳本,在該腳本中,我搜索頁面中的所有img標籤,並且只想抓取具有一定寬度的圖片。HTML解析中的標籤

下面是一個標籤的例子:

<img 
    alt="" 
    src="//upload.wikimedia.org/wikipedia/en/thumb/a/a9/Example.jpg/111px-Example.jpg" 
    width="111" 
    height="120" 
/> 

的問題是,不是所有的img標籤具有width屬性。我只想訪問具有width屬性的img標籤。

到目前爲止,我沿着線的東西:

images= soup.findAll("img") 
listimages= [] 
for img in images: 
    if img['width']!==None: 
     listimages.append(img) 

這似乎並沒有工作。看起來缺少width屬性不會產生NoneType。那麼如果不是None,那麼是什麼?

+0

順便說一句,''==上面的代碼應該是'=',避免語法錯誤!。 –

+0

如果您遇到類似的問題,將來無法通過列表理解解決問題,請嘗試'img.get('width')'。如果沒有這樣的屬性,它將返回None。 – OregonTrail

回答

-1
[img for img in soup.findAll("img") if "width" in img.attrs] 
+0

一些額外的上下文可能會有所幫助。 –

+0

@ user2475523比在事件之後通過列表理解運行結果 - 您的代碼更具可讀性並且運行速度更快,您最好使用內置於BeautifulSoup中的過濾功能(請參閱我的答案)。 –

0

BeautifulSoup提供呼叫findAll()來處理這個的一種方式:

soup.findAll("img", width=True) 

從上面的鏈接:

特殊值true和都不是特別感興趣的。 True與給定屬性具有任何值的標籤匹配,而None與沒有給定屬性值的標籤匹配。一些例子:

soup.findAll(align=True) 
# [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>, 
# <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>] 

[tag.name for tag in soup.findAll(align=None)] 
# [u'html', u'head', u'title', u'body', u'b', u'b']