BeautifulSoup: Как удалить пустые таблицы, сохранив таблицы, которые частично пусты или не пусты - PullRequest
4 голосов
/ 01 февраля 2012

У меня есть старый веб-сайт, первоначально созданный в MS Frontpage, который я пытаюсь дефронтировать.Я написал скрипт BeautifulSoup, который делает большую часть этого.Осталось только удалить пустые таблицы, например таблицы без текстового содержимого или данные в любых их тегах td.

Проблема, на которой я застрял, состоит в том, что то, что я до сих пор пробовал, удаляет таблицу, если хотя бы один из ее тегов td не содержит данных, даже если это делают другие.При этом удаляются все таблицы во всем документе, включая таблицы с данными, которые я хочу сохранить.

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

Любые предложения по удалению только таблиц, в которых нет тегов td содержат любыеданные?(Мне все равно, если они содержат img или пустые теги привязки, если нет текста).

1 Ответ

4 голосов
/ 01 февраля 2012

Используйте свойство .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
...