【问题标题】:How to find tags with only certain attributes - BeautifulSoup如何查找仅具有某些属性的标签 - BeautifulSoup
【发布时间】:2012-02-14 13:45:09
【问题描述】:

我将如何使用 BeautifulSoup 搜索仅包含我搜索的属性的标签?

例如,我想查找所有<td valign="top"> 标签。

以下代码: raw_card_data = soup.fetch('td', {'valign':re.compile('top')})

获取我想要的所有数据,但也获取任何具有valign:top 属性的<td> 标记

我也试过: raw_card_data = soup.findAll(re.compile('<td valign="top">')) 这什么也不返回(可能是因为正则表达式错误)

我想知道 BeautifulSoup 中是否有办法说“查找唯一属性为 valign:top<td> 标签”

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

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

我只想返回第一个 &lt;td&gt; 标记 (&lt;td width="580" valign="top"&gt;)

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

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

    <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"}) 
     
    

    【讨论】:

      【解决方案2】:

      BeautifulSoup 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>
      

      【讨论】:

      • 根据我对 julio.alegria 的评论,这将找到所有具有 valign="top" 属性的 &lt;tr&gt; 标签,包括具有其他属性的标签(&lt;td width="580" valign="top"&gt; 在此搜索中也返回)我'我正在寻找一种方法来找到唯一属性为valign="top"&lt;tr&gt;标签
      • 所以,你可以检查 len(tag.attrs)。如果 len(tag.attrs) > 1,忽略标签(我已经编辑了我的帖子)
      【解决方案3】:

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

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

      根据史蒂夫·洛里默的说法,最好通过 True 而不是正则表达式

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

      【讨论】:

      • r".*" 后面缺少括号,导致无法编译。
      • 不需要正则表达式,直接传True:results = soup.findAll("td", {"valign" : True})
      【解决方案4】:

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

      【讨论】:

      • 我已经尝试过同样的方法,但是这不起作用,有什么解决方法吗?
      • @PaneendraCharyuluKanduri 抱歉,代码中存在严重的编码错误。现在复制和粘贴应该可以工作了!
      【解决方案5】:

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

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

      【讨论】:

      • 如果我事先不知道值,只想找到包含 valign 属性的标签怎么办?
      • @MasayoMusic 你可以做 soup.select('td[valign]') 来选择所有具有 'valign' 属性的 。您也可以省略标签名称以选择所有具有 'valign' 属性的元素
      【解决方案6】:

      您可以在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")
      

      【讨论】:

      • 最佳答案,因为它使用了 BS 的全部功能
      • 很好的答案,因为它以非常优化的方式为您提供结果。
      【解决方案7】:

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

      【讨论】:

      • 如果有这样的标签怎么办:&lt;td width="580" valign="top"&gt;?我不想抓住那些,只是那些唯一属性是valign="top"的标签
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多