2016-09-20 7 views
1

ich eine Tabellenstruktur haben, die wie folgt aussieht:Scrape Tisch mit BeautifulSoup

<tr><td> 
<td> 
<td bgcolor="#E6E6E6" valign="top" align="left">testtestestes</td> 
</tr> 
<tr nowrap="nowrap" valign="top" align="left"> 
<td nowrap="nowrap">8-K</td> 
<td class="small">Current report, items 1.01, 3.02, and 9.01 
<br>Accession Number: 0001283140-16-000129 &nbsp;Act: 34 &nbsp;Size:&nbsp;520 KB 
</td> 
<td nowrap="nowrap">2016-09-19<br>17:30:01</td> 
<td nowrap="nowrap">2016-09-19</td><td align="left" nowrap="nowrap"><a href="/cgi-bin/browse-edgar?action=getcompany&amp;filenum=001-03473&amp;owner=include&amp;count=100">001-03473</a> 
<br/>161891888</td></tr> 

die eine Zeile von Daten ist. Dies ist mein Skript mit beautifulSoup. Ich kann die <tr> und <td> ganz gut bekommen. Aber sie sind in einer separaten Liste.

for tr in (soup.find_all('tr')): 
     tds = tr.find_all('td') 
     print tds 

Mein Problem ist, wie kann ich die Daten aus zwei separaten <tr> bekommen und lassen es so aussehen, wie sie eine Reihe von Daten sind. Ich versuche, den Text zwischen <td>

+0

Was versuchen Sie zu bekommen? –

+0

Sie möchten also alle zwei Jahre eine Paarung machen? –

+0

ja richtig @PadraicCunningham – essramos

Antwort

0

zu erhalten, wenn Sie sie bis koppeln möchten, erstellen Sie einen Iterator aus soup.find_all('tr') und zip sie in Zweiergruppen:

it = iter(soup.find_all('tr')) 
for tr1, tr2 in zip(it, it): 
     tds = tr1.find_all('td') + tr2.find_all("td") 
     print(tds) 

Das Äquivalent mit Slicing wäre mit zu beginnen eine andere Startpos und einen Schritt 2 verwenden:

it = soup.find_all('tr') 
for tr1, tr2 in zip(it[::2], it[1::2]): 
     tds = tr1.find_all('td') + tr2.find_all("td") 
     print(tds) 

Mit iter bedeutet, dass Sie die Liste flache Kopie nicht brauchen.

Nicht sicher, wie mit einer unebenen Menge trs in die Logik passt, da es nichts zu paaren sein würde, aber wenn es Sie izip_longest verwenden:

from itertools import izip_longest # python3 zip_longest 

it = iter(soup.find_all('tr')) 
for tr1, tr2 in izip_longest(it, it): 
     tds = tr1.find_all('td') + tr2.find_all("td") if tr2 else [] 
     print(tds) 
+0

das setzt voraus, dass die Anzahl von '' immer gerade ist? – essramos

+0

@wasp, wenn sie nicht deine Frage wären, ergibt das keinen Sinn, wie kannst du eine einzelne Zeile paaren? Unabhängig davon können Sie 'izip_longest/zip_longest' verwenden, ich werde –

+0

Woops bearbeiten. Entschuldigung, du hast Recht. Ich habe es ausprobiert und es funktioniert! Vielen Dank. Ich habe die erste Lösung verwendet – essramos

Verwandte Themen