1

我一直在尝试开始使用 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>

我想只<td align="center">从上面提取。所以,我有类似的东西:

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

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

4

2 回答 2

2

您无法搜索仅具有您指定的属性的所有标签……但您可以None通过指定其值来搜索不具有特定属性的标签。所以:

>>> td_al_center = soup.find_all('td', {'align': 'center', 'valign': None})
>>> td_al_center
[<td align="center">
foo bar
</td>]
于 2013-10-25T19:58:33.240 回答
1

假设您的标准是元素 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或标签名称简写可以强制除功能过滤器之外的所有其他属性不存在。

于 2013-10-25T19:52:25.240 回答