2012-03-20 4 views
5

Voglio trovare tutte le tabelle in html utilizzando BeautifulSoup. I tavoli interni dovrebbero essere inclusi nei tavoli esterni.Trova tutte le tabelle in html utilizzando BeautifulSoup

Ho creato un codice che funziona e fornisce l'output previsto. Ma questa soluzione non mi piace, perché distrugge l'oggetto "zuppa".

Sai come farlo in modo più elegante?

from BeautifulSoup import BeautifulSoup as bs 

input = '''<html><head><title>title</title></head> 
<body> 
<p>paragraph</p> 
<div><div> 
    <table>table1<table>inner11<table>inner12</table></table></table> 
    <div><table>table2<table>inner2</table></table></div> 
</div></div> 
<table>table3<table>inner3</table></table> 
<table>table4<table>inner4</table></table> 
</html>''' 

soup = bs(input) 
while(True): 
    t=soup.find("table") 
    if t is None: 
     break 
    print str(t) 
    t.decompose() 

Output:  
<table>table1<table>inner11<table>inner12</table></table></table> 
<table>table2<table>inner2</table></table> 
<table>table3<table>inner3</table></table> 
<table>table4<table>inner4</table></table> 

risposta

13

uso soup.findAll("table") anziché find() e decompose():

tables = soup.findAll("table") 

for table in tables: 
    if table.findParent("table") is None: 
     print str(table) 

uscita:

<table>table1<table>inner11<table>inner12</table></table></table> 
<table>table2<table>inner2</table></table> 
<table>table3<table>inner3</table></table> 
<table>table4<table>inner4</table></table> 

e nulla viene distrutto/distrutta.