2017-07-07 10 views
0

pythonでbeautifulsoupを使用していて、特定のタグで囲まれた文字列からすべてを削除したいそれ。この例では、DOCAのテキストでその内部にtypeタグを持つすべてのドキュメントを削除したいと考えています。特定のタグとテキストを含むすべてのタグ/コンテンツを削除するPython beautifulsoup

<body> 
    <document> 
     <type>DOCA 
      <sequence>1 
      <filename>DOCA.htm 
      <description>FORM DOCA 
      <text> 
       <title>Form DOCA</title> 
       <h5 align="left"><a href="#toc">Table of Contents</a></h5> 
    </document> 
    <document> 
     <type>DOCB 
     <sequence>1 
     <filename>DOCB.htm 
     <description>FORM DOCB 
     <text> 
      <title>Form DOCB</title> 
      <h5 align="left"><a href="#toc">Table of Contents</a></h5> 
    </document> 
<body> 

私は何をしたいことは<type>のDOCAを持っているすべての<document>を削除します:

のは、私はこのような何かを持っているとしましょう。私は、次のことを試してみましたが、それは動作しません:

>>print(soup.find('document').find('type', text = re.compile('DOCA.*'))) 
None 

答えて

1

あなたはすべての文書を照会し、その後、各ドキュメント内の、すべてのタイプを照会、DOCAはそれらのいずれかに存在するかどうかを確認し、全体を削除することができますそれがあれば文書を囲みます。

from bs4 import BeautifulSoup 

soup = BeautifulSoup(..., 'html.parser') 

for doc in soup.find_all('document'): 
    for type in doc.find_all('type'): 
     if 'DOCA' in type.text: 
      doc.extract() 
      break 

print(soup) 

出力:

<body> 

<document> 
<type>DOCB 
     <sequence>1 
     <filename>DOCB.htm 
     <description>FORM DOCB 
     <text> 
<title>Form DOCB</title> 
<h5 align="left"><a href="#toc">Table of Contents</a></h5> 
</text></description></filename></sequence></type></document> 
</body> 
2

あなたは例えば、要素を選択するfind方法でlambdaを使用することができます。

soup.find('document').find(lambda tag : tag.name == 'type' and 'DOCA' in tag.text) 

その後、あなたはその要素を削除するextractまたはdecomposeを使用することができます。

編集:すべての要素を選択するには使用この式:

soup.find_all(lambda tag:tag.name == 'document' 
    and tag.find(lambda t:t.name == 'type' and 'DOCA' in t.text)) 
+0

方法は、大規模な文書のための速いでしょうか?このラムダを使うか、@ COLDSPEEDの答えのようにループしますか? – cullan

+0

私はそれについては分かりません。 @COLDSPEEDは2つのループを使用しますが、これは少し遅くする必要があります。一方、彼のコードでは要素が即座に削除され、スープオブジェクトはクリーンアップされますが、コードで不要な項目のリストが生成されます –

+0

@cullan 1.23 ms(鉱山)vs 1.33 ms +(他のオーバーヘッドを削除する) –

関連する問題