2012-01-19 69 views
36

如何使用BeautifulSoup搜索僅包含我搜索的屬性的標籤?如何查找僅具有某些屬性的標籤 - BeautifulSoup

例如,我想要查找所有<td valign="top">標籤。

下面的代碼: raw_card_data = soup.fetch('td', {'valign':re.compile('top')})

得到所有我想要的數據,但也抓住任何<td>標籤具有屬性valign:top

我也試過: raw_card_data = soup.findAll(re.compile('<td valign="top">')) 這沒有返回值(可能因爲壞的正則表達式)

我想知道是否有一種方法在BeautifulSoup說「查找<td>標籤的唯一屬性是valign:top

UPDATE 例如,如果一個HTML文檔包含以下<td>標籤:

<td valign="top">.....</td><br /> 
<td width="580" valign="top">.......</td><br /> 
<td>.....</td><br /> 

我想只有第一<td>標籤(<td width="580" valign="top">)返回

回答

49

由於在BeutifulSoup documentation

解釋你可以使用這個:

soup = BeautifulSoup(html) 
results = soup.findAll("td", {"valign" : "top"}) 

編輯:

要返回都只有VALIGN =「頂」屬性標籤,你可以檢查的長度標籤attrs屬性:

from BeautifulSoup import BeautifulSoup 

html = '<td valign="top">.....</td>\ 
     <td width="580" valign="top">.......</td>\ 
     <td>.....</td>' 

soup = BeautifulSoup(html) 
results = soup.findAll("td", {"valign" : "top"}) 

for result in results : 
    if len(result.attrs) == 1 : 
     print result 

返回:

<td valign="top">.....</td> 
+0

根據我對julio的評論。alegria,這將找到所有具有valign =「top」屬性的''標籤,包括具有其他屬性的標籤('也會在此搜索中返回) '尋找一種方法來找到''標籤,其唯一的屬性是'valign =「top」' – Snaxib

+0

因此,你可以檢查len(tag.attrs)。如果len(tag.attrs)> 1,忽略標籤(我已編輯我的帖子) –

+0

真棒,謝謝你! – Snaxib

2

只是通過它作爲參數findAll

>>> from BeautifulSoup import BeautifulSoup 
>>> soup = BeautifulSoup(""" 
... <html> 
... <head><title>My Title!</title></head> 
... <body><table> 
... <tr><td>First!</td> 
... <td valign="top">Second!</td></tr> 
... </table></body><html> 
... """) 
>>> 
>>> soup.findAll('td') 
[<td>First!</td>, <td valign="top">Second!</td>] 
>>> 
>>> soup.findAll('td', valign='top') 
[<td valign="top">Second!</td>] 
+1

如果有像這樣的標籤會怎麼樣:''?我不想搶這些,只是標籤的唯一屬性是'valign =「top」' – Snaxib

26

可以在findAll使用lambda功能作爲documentation解釋。所以,在你的情況下,只有valign = "top"使用搜索td標籤下面:

td_tag_list = soup.findAll(
       lambda tag:tag.name == "td" and 
       len(tag.attrs) == 1 and 
       tag["valign"] == "top") 
+3

最好的答案,因爲它使用BS的全部功能 –

+1

很好的答案,因爲它給你帶來非常優化的方式。 – CrazyGeek

3

要做到這一點,最簡單的方法是使用新的CSS樣式select方法:

soup = BeautifulSoup(html) 
results = soup.select('td[valign="top"]') 
+0

也是使用最新版本的那個。 –

4

,如果你想只用屬性名稱搜索任意值

from bs4 import BeautifulSoup 
import re 

soup= BeautifulSoup(html.text,'lxml') 
results = soup.findAll("td", {"valign" : re.compile(r".*")}) 
+0

你錯過了'r'後面的括號。*「',導致不能編譯。 –

相關問題