BeautifulSoup:如何去除空表格,同时保留部分空或不空的表格

5 投票
1 回答
2453 浏览
提问于 2025-04-17 12:04

我有一个旧网站,最开始是用MS Frontpage制作的,现在我想把它从Frontpage的格式中解放出来。我写了一个BeautifulSoup的脚本,基本上完成了大部分工作。现在剩下的就是要删除那些空的表格,也就是那些在td标签里没有任何文本内容或数据的表格。

我现在遇到的问题是,我之前尝试的方法会删除只要有一个td标签没有数据的表格,即使其他的标签里有数据。这导致整个文档里的所有表格都被删除了,包括那些我想保留的数据表格。

tags = soup.findAll('table',text=None,recursive=True) 
[tag.extract() for tag in tags]

有没有什么建议,可以让我只删除那些所有td标签里都没有数据的表格?(我不在乎它们是否包含img标签或空的链接标签,只要里面没有文本就行)。

1 个回答

4

使用 .text 属性。这个属性可以获取到那个元素里面的所有文本内容,包括里面的所有子元素的文本。

举个例子:

from BeautifulSoup import BeautifulSoup as BS

html = """
<table id="empty">
  <tr><td></td></tr>
</table>

<table id="with_text">
  <tr><td>hey!</td></tr>
</table>

<table id="with_text_in_one_row">
  <tr><td></td></tr>
  <tr><td>hey!</td></tr>
</table>

<table id="no_text_but_img">
  <tr><td><img></td></tr>
</table>

<table id="no_text_but_a">
  <tr><td><a></a></td></tr>
</table>

<table id="text_in_a">
  <tr><td><a>hey!</a></td></tr>
</table>

"""

soup = BS(html)
for table in soup.findAll("table" ,text=None,recursive=True):
    if table.text:
        print table["id"]

输出结果:

with_text
with_text_in_one_row
text_in_a

撰写回答