BeautifulSoup:如何删除空表,同时保留部分空或非空的表

Kur*_*sis 5 python parsing beautifulsoup html-parsing

我有一个最初在 MS Frontpage 中创建的旧网站,我正在尝试对其进行 defrontpagify。我已经编写了一个 BeautifulSoup 脚本来完成大部分工作。唯一剩下的就是删除空表,如表在没有文本内容或数据的任何自己的td标签。

我遇到的问题是,如果至少有一个td标签不包含数据,即使其他标签不包含数据,我迄今为止尝试过的方法会删除该表。这将删除整个文档中的所有表格,包括我想要保留的数据的表格。

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

任何建议如何仅删除其中没有任何 td 标签包含任何数据的表?(我不在乎它们是否包含img或空锚标记,只要没有文本即可)。

Ava*_*ris 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"]
Run Code Online (Sandbox Code Playgroud)

输出:

with_text
with_text_in_one_row
text_in_a
Run Code Online (Sandbox Code Playgroud)