2017-02-24 5 views
0

Ich bin neu zu Beautifulsoup und Python, und ich bin mir ziemlich sicher, dass dies ein tot-einfaches Problem ist, aber ich kann nicht nirgends lösen es zu bekommen.Python BeautifulSoup Schleife durch Tabelle Zeilen nach Abschnitt

Ich versuche, Zeilen einer HTML-Tabelle zu durchlaufen, basierend auf "Kopfzeilen", die die Tabelle nach Arten von Süßigkeiten gruppieren. Meine Tabelle sieht so aus: enter image description here

Ich möchte die Schleife, um das Datum unter jeder Süßigkeiten Überschrift zu bekommen. So würden die Iterationen Daten wie diese:

erste Schleifeniterationslatenzzeit: candy_type: kitkat, Lage: Mall 1, Planned: 63, Aktuell: 0, Diff: 25

zweite Iteration: candy_type: kitkat, Lage: Mall 2, Geplanter: 7, Actual: 0, Diff: 6

... letzte Iteration: candy_type: Skittles, Ort: Gebäude 2, Geplant: 320, Aktuell: 236, Diff: 0

Dies ist der Tabellencode:

<TABLE BORDER="1" WIDTH="100%"> 
    <TR> 
     <TH COLSPAN=4>Candy</TH> 
    </TR> 
    <TR BGCOLOR=#CEE3F6> 
     <TD COLSPAN=4> 
     <FONT FACE=Arial> 
      <center><b>KitKat</b></center> 
     </FONT> 
     </TD> 
    </TR> 
    <TR BGCOLOR=#336699> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>LOCATION</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>PLANNED</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>ACTUAL</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>DIFF</FONT></TD> 
    </TR> 
    <TR> 
     <TD>Mall 1</TD> 
     <TD>63</TD> 
     <TD>0</TD> 
     <TD>25</TD> 
    </TR> 
    <TR> 
     <TD>Mall 2</TD> 
     <TD>7</TD> 
     <TD>0</TD> 
     <TD>6</TD> 
    </TR> 
    <TR BGCOLOR=#CEE3F6> 
     <TD COLSPAN=4> 
     <FONT FACE=Arial> 
      <center><b>OH Henry</b></center> 
     </FONT> 
     </TD> 
    </TR> 
    <TR BGCOLOR=#336699> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>LOCATION</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>PLANNED</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>ACTUAL</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>DIFF</FONT></TD> 
    </TR> 
    <TR> 
     <TD>Warehouse 1</TD> 
     <TD>195</TD> 
     <TD>122</TD> 
     <TD>30</TD> 
    </TR> 
    <TR> 
     <TD>Warehouse 2</TD> 
     <TD>96</TD> 
     <TD>76</TD> 
     <TD>6</TD> 
    </TR> 
    <TR BGCOLOR=#CEE3F6> 
     <TD COLSPAN=4> 
     <FONT FACE=Arial> 
      <center><b>Skittles</b></center> 
     </FONT> 
     </TD> 
    </TR> 
    <TR BGCOLOR=#336699> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>LOCATION</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>PLANNED</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>ACTUAL</FONT></TD> 
     <TD><FONT COLOR=White FACE=Arial SIZE=-2>DIFF</FONT></TD> 
    </TR> 
    <TR> 
     <TD>Building 1</TD> 
     <TD>120</TD> 
     <TD>90</TD> 
     <TD>5</TD> 
    </TR> 
    <TR> 
     <TD>Building 2</TD> 
     <TD>320</TD> 
     <TD>236</TD> 
     <TD>0</TD> 
    </TR> 
</TABLE> 

so habe ich versucht,

from bs4 import BeautifulSoup 
import urllib 

readUrl = urllib.urlopen('test.html').read() 
soup = BeautifulSoup(readUrl) 
candytype = soup.findAll('tr',{"bgcolor" : "#CEE3F6"}) 
for type in candytype: 
    print type 

Dieser druckt die drei Süßigkeiten-Typen wie folgt aus:

<tr bgcolor="#CEE3F6"> 
<td colspan="4"> 
<font face="Arial"> 
</font><center><b>KitKat</b></center> 
</td> 
</tr> 
<tr bgcolor="#CEE3F6"> 
<td colspan="4"> 
<font face="Arial"> 
</font><center><b>OH Henry</b></center> 
</td> 
</tr> 
<tr bgcolor="#CEE3F6"> 
<td colspan="4"> 
<font face="Arial"> 
</font><center><b>Skittles</b></center> 
</td> 
</tr> 

Ich dachte, ich könnte die Süßigkeiten "Header" gruppieren (d. H. die tr Elemente, deren bgcolor auf #CEE3F6 gesetzt ist) und dann auf dieser Basis iterieren, aber ich kann nicht herausfinden, wie man weiter in die Daten kommt.

Irgendwelche Ideen?

+0

müssen Sie 'beautifulsoup' verwenden? Ich würde empfehlen, ['parsel'] (https://github.com/scrapy/parsel) zu verwenden – eLRuLL

Antwort

2

Suchen Sie alle Zeilen und durchlaufen Sie sie dann. Wenn Sie eine finden, die den Namen einer Süßigkeit enthält (durch die Farbe der Reihe), behalten Sie diesen Namen. Identifiziere jetzt die nächsten Geschwister dieser Reihe. Überspringen Sie die erste, die eine Überschrift sein wird, aber erfassen Sie nachfolgende Texte aus den td Elementen. Du weißt, dass du das letzte Geschwister gefunden hast, wenn du auf den Namen einer anderen Süßigkeit triffst (wieder in der Farbe der Reihe).

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(open('justTable.htm').read(), 'lxml') 
>>> trs = soup.findAll('tr') 
>>> for tr in trs: 
...  if 'bgcolor' in tr.attrs and tr.attrs['bgcolor']=='#CEE3F6': 
...   candy = tr.text.strip() 
...   first = True 
...   for sibs in tr.fetchNextSiblings(): 
...    if first: 
...     first = False 
...     continue 
...    if 'bgcolor' in sibs.attrs and sibs.attrs['bgcolor']=='#CEE3F6': 
...     break 
...    [candy]+sibs.text.strip().split('\n') 
... 
['KitKat', 'Mall 1', '63', '0', '25'] 
['KitKat', 'Mall 2', '7', '0', '6'] 
['OH Henry', 'Warehouse 1', '195', '122', '30'] 
['OH Henry', 'Warehouse 2', '96', '76', '6'] 
['Skittles', 'Building 1', '120', '90', '5'] 
['Skittles', 'Building 2', '320', '236', '0'] 
Verwandte Themen