2017-03-04 7 views
2

私はテキスト、テーブル、htmlでいくつかのWebページを解析しようとしています。すべてのページの段落数は異なりますが、すべての段落は開封<div>で始まりますが、終了まで</div>の終了は発生しません。 text1 <b>text2</b> (table_deleted) text3BeautifulSoupでネストされたdivを解析する

実際の結果text1\n\ntext2some text heretext 3text2some text heretext 3 (table deleted)

from bs4 import BeautifulSoup 

html = """ 
<h1>title</h1> 
<h3>extra data</h3> 
<div> 
    text1 
    <div> 
     <b>next2</b><table>some text here</table>text 3 
    </div> 
</div>""" 

soup = BeautifulSoup(html, 'html5lib') 
tags = soup.find('h3').find_all_next() 
contents = "" 
for tag in tags: 
    if tag.name == 'table': 
     contents += " (table deleted) " 

    contents += tag.text.strip() 

print(contents) 
+0

を使用して、「表」タグを交換し、それを変更することができ、なぜ解析祖先? – putonspectacles

+0

ハァッ。私は自分のために物事を難しくするのが好きだと思います。それは本当にうまくいく。 :) – bluppfisk

答えて

0

代わりに、パーサーとしてhtml5libを使用しないでください:私はちょうど

望ましい結果特定の要素をフィルタリングし、何か他のものでそれらを置き換える、コンテンツを取得しようとしていますhtml.parserを使用してください。つまり、css selectorselect_oneメソッドを使用して、 "h3"タグの直後にある "div"にアクセスできます。そこから

、次の「DIV」タグをunwrap、なぜあなただ​​けのテーブルタグを見つけることができませんreplace_with方法

In [107]: from bs4 import BeautifulSoup 

In [108]: html = """ 
    ...: <h1>title</h1> 
    ...: <h3>extra data</h3> 
    ...: <div> 
    ...:  text1 
    ...:  <div> 
    ...:   <b>next2</b><table>some text here</table>text 3 
    ...:  </div> 
    ...: </div>""" 

In [109]: soup = BeautifulSoup(html, 'html.parser') 

In [110]: my_div = soup.select_one('h3 + div') 

In [111]: my_div 
Out[111]: 
<div> 
    text1 
    <div> 
<b>next2</b><table>some text here</table>text 3 
    </div> 
</div> 

In [112]: my_div.div.unwrap() 
Out[112]: <div></div> 

In [113]: my_div 
Out[113]: 
<div> 
    text1 

<b>next2</b><table>some text here</table>text 3 

</div> 

In [114]: my_div.table.replace_with('(table deleted)') 
Out[114]: <table>some text here</table> 

In [115]: my_div 
Out[115]: 
<div> 
    text1 

<b>next2</b>(table deleted)text 3 

</div> 
関連する問題