【问题标题】:beautiful soup extracting exact td tags美丽的汤提取精确的 td 标签
【发布时间】:2013-10-25 19:44:50
【问题描述】:

我一直在尝试开始使用 BS4,但我似乎在使用其中一张表时遇到了一些问题。所以,我有如下内容:

<td align="center" valign="top">
foo
</td>
<td align="center">
foo bar
</td>
<td align="center" class="new" valign="top">bar</td>
<td align="center" class="newq" valign="top">foo</td>

我想从上面提取&lt;td align="center"&gt;。所以,我有类似的东西:

td_al_center = soup.find_all('td',{'align':'center'})

但这给了我以上所有 4 种组合。如何指定仅提取&lt;td align="center"&gt;(带有foo bar 的那个)?如果有人能让我走上正轨,我将不胜感激..

【问题讨论】:

  • 试试soup.find_all('td',{'class':'new'})
  • @SivaCn:为什么?那显然不会返回他想要的那个。
  • @abarnert 它工作正常(Python2.7)soup.findAll('td', {'class': 'new'}),这是一个坏主意,通过使用align="center" 等常用参数进行过滤,因为可能有多个与之关联的标签.
  • @SivaCn:不,它没有。他想找到第二个标签,即带有“foo bar”的标签。您将找到第三个标签,即带有“bar”的标签。而且没有明显的方法来调整你正在做的事情来找到他想要的东西——事实上,这正是他所要求的。

标签: python python-2.7 beautifulsoup


【解决方案1】:

您无法搜索仅具有您指定的属性的所有标签……但是您可以搜索没有特定属性的标签,方法是将None 指定为它的价值。所以:

>>> td_al_center = soup.find_all('td', {'align': 'center', 'valign': None})
>>> td_al_center
[<td align="center">
foo bar
</td>]

【讨论】:

  • 太棒了——这正是我想要的。非常感谢这一点。浪费了 2 个小时来寻找如何做到这一点!
【解决方案2】:

假设您的条件是元素 a) 必须具有 align="center" 并且 b) 不能具有任何其他属性,在我看来您必须使用函数作为过滤器。

def centered_only(tag):
    return len(tag.attrs) == 1 and tag.attrs.get('align') == 'center'

td_al_center = soup.td(centered_only)

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function 了解有关过滤器功能的详细信息。

正如您所见,过滤特定属性的值很容易,但我在find_all 或标签名称简写中看不到任何可以强制除功能过滤器之外的所有其他属性的情况。

【讨论】:

  • 在这种特殊情况下这不是必需的,但它是问题和所有相关问题的最通用解决方案。
猜你喜欢
  • 2021-03-20
  • 1970-01-01
  • 2021-02-08
  • 2020-03-17
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
相关资源
最近更新 更多