2012-01-19 68 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'后面的括号。*“',导致不能编译。 –

相关问题