如何查找仅具有某些属性的标签-BeautifulSoup


84

如何使用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>标记,则为UPDATE

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

我只希望第一个<td>标签(<td width="580" valign="top">)返回

Answers:


96

BeutifulSoup文档中所述

您可以使用:

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

编辑:

要返回仅具有valign =“ top”属性的标签,可以检查tagattrs属性的长度:

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>

根据我对julio.alegria的评论,它将查找<tr>具有该属性的所有标签valign="top",包括具有其他属性的所有标签(<td width="580" valign="top">在搜索中也返回)我正在寻找一种方法来查找<tr>其唯一属性为valign="top"
Snaxib

因此,您可以检查len(tag.attrs)。如果len(tag.attrs)> 1,忽略标签(我已经编辑我的职务)
卢瓦克G.

51

您可以按照文档lambda中的findAll说明使用函数。因此,在您的情况下,仅使用以下内容来搜索标签:tdvalign = "top"

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

4
最佳答案,因为它使用了BS的全部功能
Rafael T

2
很好的答案,因为它给您带来非常优化的结果。
CrazyGeek

32

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

from bs4 import BeautifulSoup
import re

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

根据Steve Lorimer的说法,最好通过True而不是regex

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

2
您在之后缺少括号r".*",从而导致未编译。
杰克·科尔

9
无需正则表达式,只需通过Trueresults = soup.findAll("td", {"valign" : True})
Steve Lorimer

14

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

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

4

只需将其作为以下参数传递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
如果有这样的标签<td width="580" valign="top">怎么办?我不想抓住那些标签,只是那些标签的唯一属性是valign="top"
Snaxib 2012年

2

添加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]')

我已经尝试过相同的方法,但是这不起作用,是否有任何解决方法?
Phaneendra Charyulu Kanduri,

1
@PhaneendraCharyuluKanduri对不起,代码中存在错误的编码错误。现在,复制和粘贴应该可以了!
GrazingScientist,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.