如何找到只有某些属性的标签 - BeautifulSoup

时间:2012-01-19 21:50:06

标签: python 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

更新 例如,如果HTML文档包含以下<td>标记:

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

我希望只返回第一个<td>代码(<td width="580" valign="top">

7 个答案:

答案 0 :(得分:79)

正如BeutifulSoup documentation

所述

你可以用这个:

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

编辑:

要返回仅包含valign =“top”属性的标记,您可以检查标记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>

答案 1 :(得分:33)

您可以使用lambda中的findAll功能,如documentation中所述。因此,在您的情况下,仅使用td搜索valign = "top"代码,请使用以下内容:

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

答案 2 :(得分:16)

如果您只想使用具有任何值的属性名称进行搜索

from bs4 import BeautifulSoup
import re

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

根据史蒂夫·洛里默更好地传递真实而不是正则表达式

results = soup.findAll("td", {"valign" : True})

答案 3 :(得分:9)

最简单的方法是使用新的CSS样式select方法:

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

答案 4 :(得分:3)

将其作为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>]

答案 5 :(得分:0)

添加Chris Redford和Amr的答案,您还可以使用select命令搜索具有任何值的属性名称:

from bs4 import BeautifulSoup as Soup
html = '<td valign="top">.....</td>\
    <td width="580" valign="top">.......</td>\
    <td>.....</td>'
soup = Soup(html, 'lxml')
results = soup.select('td[valign]')

答案 6 :(得分:0)

在任何标签中使用属性查找

<th class="team" data-sort="team">Team</th>    
soup.find_all(attrs={"class": "team"}) 

<th data-sort="team">Team</th>  
soup.find_all(attrs={"data-sort": "team"})