2017-01-13 11 views
1

私はBeautifuloupを使ってhtmlタグを抽出し、テキストを削除しようとしています。美しいスープ抽出タグがテキストを削除

ここ
<html> 
<body> 
<table> 
<tr><td></td></tr> 
<tr><td></td></tr> 
<tr><td></td></tr> 
<tr><td></td></tr> 
</table> 
</body> 
</html> 

は、私がこれまで持っているものです::

html_page = """ 
<html> 
<body> 
<table> 
<tr class=tb1><td>Lorem Ipsum dolor Sit amet</td></tr> 
<tr class=tb1><td>Consectetuer adipiscing elit</td></tr> 
<tr><td>Aliquam Tincidunt mauris eu Risus</td></tr> 
<tr><td>Vestibulum Auctor Dapibus neque</td></tr> 
</table> 
</body> 
</html> 
""" 

所望の結果は次のとおりです。たとえば、このHTMLを取る=は、{}のために働く

def get_tags(soup): 
    copy_soup = soup 
    for tag in copy_soup.findAll(True): 
     tag.attrs = {} # removes attributes of a tag 
     tag.string = '' 

    return copy_soup 

print get_tags(soup) 

使用tag.attrsすべてのタグ属性を削除します。しかし、私がtag.stringまたはtag.clear()を使用しようとすると、私はちょうど<html></html>のままになります。おそらく起こっていることは、tag.stringまたはtag.clear()を使用した最初の繰り返しで、htmlタグ内のすべてのコンテンツが削除されていることを理解しています。

これを解決する方法がわかりません。おそらく子供たちから最初に再帰的にテキストを削除するでしょうか?または、私が行方不明の簡単なアプローチがありますか?

答えて

1

.stringを空の文字列にリセットすることはできません。たとえば、要素にtr要素のようなテキストの子が1つしかない場合は、ツリーからtd要素を削除します。

.clear()はすべての子ノードも再帰的に削除するため、使用できません。

私はBeautifulSoupでデータのないHTMLのツリー構造を取得するための組み込みの方法を覚えていません - 私は、次のアプローチを使用したい:

for elm in soup.find_all(): 
    if not elm.find(recursive=False): # if not children 
     elm.string = '' 
    elm.attrs = {} 

ここでは.stringのみがある場合をリセットしています子供はいません。

デモ:

>>> from bs4 import BeautifulSoup 
>>> 
>>> html_page = """ 
... <html> 
... <body> 
... <table> 
... <tr class=tb1><td>Lorem Ipsum dolor Sit amet</td></tr> 
... <tr class=tb1><td>Consectetuer adipiscing elit</td></tr> 
... <tr><td>Aliquam Tincidunt mauris eu Risus</td></tr> 
... <tr><td>Vestibulum Auctor Dapibus neque</td></tr> 
... </table> 
... </body> 
... </html> 
... """ 
>>> 
>>> soup = BeautifulSoup(html_page, "html.parser") 
>>> for elm in soup.find_all(): 
...  if not elm.find(recursive=False): 
...   elm.string = '' 
...  elm.attrs = {} 
... 
>>> print(soup.prettify()) 
<html> 
<body> 
    <table> 
    <tr> 
    <td> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    </td> 
    </tr> 
    </table> 
</body> 
</html> 
+0

ああは特に私の独創的なアプローチが不備た理由を正確に記述するために、説明していただきありがとうございます。 –

+0

@ hannahbanana2.0あなたの問題を解決するより美しい方法があるかどうかを知りたいです。lxmlとlxml.objectifyを見てください.. – alecxe

+0

@ hannahbanana2.0 btw、ここにあります代わりのアプローチを用いた[かなり関連するトピック](http://stackoverflow.com/questions/24640959/get-a-structure-of-html-code)は、ここでやっているより簡単かもしれません。 – alecxe

関連する問題