我如何使用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">
)
答案 0 :(得分:79)
你可以用这个:
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"})