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

时间:2012-01-31 22:48:58

标签: python parsing html-parsing beautifulsoup

我有一个最初在MS Frontpage中创建的旧网站,我正试图解决这个问题。我编写了一个BeautifulSoup脚本来完成大部分工作。剩下的就是删除空表,例如,没有文本内容的表或其td标签的任何中的数据。

我坚持的问题是,如果至少有一个td标签不包含任何数据,我到目前为止所尝试的内容将删除该表,即使其他标签也没有。这将删除整个文档中的所有表,包括那些包含我想保留的数据的表。

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

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

1 个答案:

答案 0 :(得分: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