2016-04-27 5 views
0
from bs4 import BeautifulSoup 
import urllib 
import json 
import os 

jaren = [str("2012"), str("2010"), str("2006"), str("2003"),str("2002"), str("1998"), str("1994"), str("1989"), str("1986"), str("1982"), str("1981"), str("1977"), str("1972"), str("1971"), str("1967"), str("1963"), str("1959"), str("1956")] 
DESIRED_COLUMNS = {1, 2, 5} #scrapes only afk, aantal & zetels 
verkiezingsData = [] 

filename = raw_input('Enter a filename: ') or 'data.json' 

#open file and open json array 
with open(filename, "w") as file: 
    file.write("[{") 
for Jaargetal in jaren: 

    #url source 
    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 
     with open(filename, "a+") as file: 
       file.write("\"%s\": [" % header) #header as beginning json 
     trs = table.find_all("tr")[0].getText() 
     del verkiezingsData[:] #clear list before adding new data 


     #add the 3 columns to a list 
     for tr in table.find_all("tr")[:22]: #22 aantal columns van top till bottom 
      for index, val in enumerate(tr.find_all('td')): 
        if index in DESIRED_COLUMNS: #linkt naar desired columns bovenin 
         verkiezingsData.append(val.getText().strip()) 


     #json array van de 3 vallues 
     for a, b, c in zip(verkiezingsData[::3],  verkiezingsData[1::3], verkiezingsData[2::3]): #link naar desired columns 1,2,5 
      data2 = {'afk':a,"aantal":b, "zetels":c} 

      #file writing 
      with open(filename, 'a') as outfile: 
       json.dump(data2, outfile) 
        outfile.write(",") 


     #open file, delete last comma and close array 
     with open(filename, 'ab+') as file: 
       file.seek(-1, os.SEEK_END) 
       file.truncate() 
       file.write("],") 

#open file, delete last comma, and close array 
with open(filename, 'r+b') as file: 
    file.seek(-1, os.SEEK_END) 
    file.truncate() 
    file.write("}]") 

#open file and pretty print json data 
with open(filename, 'r') as file: 
    prettydata = json.load(file) 
with open(filename, 'w') as file: 
    json.dump(prettydata, file, sort_keys=True, indent=4, separators=(',', ': ')) 

I einen Schaber, der aus nlverkiezingen.comSchaben data> Haltestelle weißen Linie

schabt gemacht, wenn es als eine Datei speichert json:

"Tweede-Kamerverkiezingen - 12 september 2012": [ 
      { 
       "aantal": "Aantal", 
       "afk": "Afk.", 
       "zetels": "Zetels" 
      }, 
      { 
       "aantal": "2504948", 
       "afk": "VVD", 
       "zetels": "41" 
      }, 

Die erste Reihe ist: Aantal/Afk/Zetels. Ich möchte nicht, dass dies gekratzt wird.

Wie kann ich das ändern? Dass das Kratzen in der zweiten Reihe beginnt

Die zweite Sache ist, dass die letzte Reihe überall anders ist. manchmal die 20. Reihe, 15. Reihe.

Wie kann ich das ändern? Dass das Kratzen endet, wenn er beim Kratzen eine weiße/leere Reihe sieht?

Antwort

0

weiß nicht, ob es richtig, es ist nur eine Vermutung, aber vielleicht so etwas wie

for tr in table.find_all("tr")[1:22] 

die erste Zeile überspringen?

0

Die erste Zeile ist: Aantal/Afk/Zetels. Ich möchte nicht, dass das gekratzt wird.

Ersetzen for tr in table.find_all("tr")[:22]: mit for tr in table.find_all("tr")[1:22]:

Python hat Null basierende Indizierung, so 1 in der Tabelle auf die zweite Zeile verweist.

Wie kann ich das ändern? Dass das Kratzen endet, wenn er beim Kratzen eine weiße/leere Reihe sieht?

Die   in den leeren Tabellenzellen wird durch BeautifulSoup als u"\xa0" Python Zeichenfolge analysiert werden. Überprüfen Sie den Inhalt des ersten Tags in jeder Zeile und vergleichen Sie ihn mit diesem Wert, und verwenden Sie diesen, um aus der Schleife auszubrechen.

+0

Ich bekomme nicht, was ich tun muss mit der   könnten Sie mir vielleicht sagen, welche Art von Code ich bearbeiten muss? @sahuk Wo kann ich zu jedem "Jahr/Website" sagen, dass es in einer bestimmten Zeile beendet werden muss? Jetzt kann ich erst um 1:22 aufhören – Danisk

Verwandte Themen