2017-03-04 2 views
2

Ich versuche, eine Reihe von Webseiten mit Text, Tabellen und HTML zu analysieren. Jede Seite hat eine andere Anzahl von Absätzen, aber während jeder Absatz mit einer Öffnung <div> beginnt, tritt der Abschluss </div> nicht bis zum Ende auf. Ich versuche nur, um den Inhalt zu bekommen, bestimmte Elemente herausgefiltert werden und ersetzt sie durch etwas anderesParsing geschachtelte Divs mit BeautifulSoup

Wunschergebnis: text1 <b>text2</b> (table_deleted) text3

Tatsächliches Ergebnis 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

warum Sie nicht nur die Tabelle Tag finden und ändern, dass ersetzen, warum die parsen Vorfahren? – putonspectacles

+0

huh. Ich schätze, ich mag es, Dinge für mich schwierig zu machen. Das funktioniert tatsächlich. :) – bluppfisk

Antwort

0

nicht html5lib als Parser verwenden Sie stattdessen Verwenden Sie html.parser. Davon abgesehen können Sie auf das "div" zugreifen, das sich unmittelbar nach Ihrem "h3" -Tag befindet, indem Sie die Methode css selector und select_one verwenden.

Von dort können Sie den folgenden „div“ tag unwrap und den „Tabelle“ Tag mit der replace_with Methode

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> 
Verwandte Themen