2016-04-16 13 views
1

Ich möchte Parsen die Afk., Aantal und Zetels Spalten auf der Website: http://www.nlverkiezingen.com/TK2012.html, dass ich schließlich als JSON-Datei speichern kann.Parsing Spalten mit BeautifulSoup und Speichern als JSON

Bevor Sie es als JSON-Datei speichern, muss ich die Elemente analysieren.

hatte ich

from bs4 import BeautifulSoup 
import urllib 

jaren = [str("2010"), str("2012")] 

for Jaargetal in jaren: 
    r = urllib.urlopen("http://www.nlverkiezingen.com/TK" + Jaargetal +".html").read() 
    soup = BeautifulSoup(r, "html.parser") 
    tables = soup.find_all("table") 

    for table in tables: 
     header = soup.find_all("h1")[0].getText() 
     print header 

     trs = table.find_all("tr")[0].getText() 
     print '\n' 
     for tr in table.find_all("tr"): 
       print "|".join([x.get_text().replace('\n','') for x in tr.find_all('td')]) 

Ive

tryed
from bs4 import BeautifulSoup 
import urllib 

jaren = [str("2010"), str("2012")] 

for Jaargetal in jaren: 
    r = urllib.urlopen("http://www.nlverkiezingen.com/TK" + Jaargetal +".html").read() 
    soup = BeautifulSoup(r, "html.parser") 
    tables = soup.find_all("table") 

    for table in tables: 
     header = soup.find_all("h1")[0].getText() 
     print header 

     for tr in table.find_all("tr"): 
      firstTd = tr.find("td") 
      if firstTd and firstTd.has_attr("class") and "l" in firstTd['class']: 
       tds = tr.find_all("td") 

       for tr in table.find_all("tr"): 
        print "|".join([x.get_text().replace('\n','') for x in tr.find_all('td')]) 
        break 

Was mache ich falsch oder was ich zu tun habe, bin ich auf dem richtigen Weg?

+1

Könnten Sie zeigen, was falsch ist genau mit dem vorhandenen Code? Vielen Dank. – alecxe

+0

@alecxe Im ersten Code druckt es alle Zeilen: Partij | Afk. | Aantal |% | +/- | Zetels Ich möchte den Code nur die Zeilen drucken lassen: Afk. Aantal und Zetels. – Danisk

Antwort

0

Eine Option, um nur die gewünschten Spalten zu extrahieren, wäre, Indizes der Spalten zu überprüfen. Definieren Sie die Spaltenindizes Sie interessiert sind:

DESIRED_COLUMNS = {1, 2, 5} # it is a set 

Und dann verwenden enumerate() mit find_all():

"|".join([x.get_text().replace('\n', '') 
      for index, x in enumerate(tr.find_all('td')) 
      if index in DESIRED_COLUMNS]) 
+0

Dank @Alecxe gibt es auch eine Option, dass ich etwas definieren kann, um nur die ersten 3 Zeilen von afk, Aantal und Zetels zum Beispiel zu bekommen? – Danisk

+0

@Danisk können Sie immer schneiden, zum Beispiel: 'tr.find_all ('td') [: 3]' – alecxe

+0

Danke für Ihre Hilfe! Ich habe noch eine kurze Frage; das funktioniert jetzt, das einzige ist, dass ich von 2012 und 2010 kratze. 2010 hat mehr les reihen als 2012, also kratzt es auch inhalt, den ich nicht will. Gibt es eine Möglichkeit zu sagen? "tr.find_all td [: 20] von der Website 2010 und tr.find_all ('tr') [: 19] von 2012 – Danisk