2017-05-31 5 views
0

Ich habe versucht, Daten von einer Website herunterzuladen und dann in eine CSV-Datei zu speichern. Das Problem ist: Ich kann es nicht richtig speichern, um es zu lesen oder in eine Datenbank zu importieren.Python: Daten von BeautifulSoup in CSV speichern

ist hier mein Code:

import csv 
import requests 
from bs4 import BeautifulSoup 

def getData(url_to_scrap='https://www.investing.com/currencies/eur-usd-historical-data', file=None, save_file="Name.csv"): 

    if url_to_scrap is not None: 
     header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} 
     r = requests.get(url_to_scrap, headers=header) 
     data = BeautifulSoup(r.content, 'html.parser') 
    else: 
     data = BeautifulSoup(open(file, encoding='utf8'), 'html.parser') 


    table = data.find(id='curr_table') 
    table = table.find_all('td') 

    row_data = [] 
    for row in table: 
     row_data.append(row.get_text('data-real-value')) 

    with open(save_file, 'w') as save: 
     for row in row_data: 
      writer = csv.writer(save, delimiter=';') 
      writer.writerow(row) 

getData(save_file="EUR USD Historical Data.csv") 

Und die Ausgabe auf der CSV-Datei:

M;a;y; ;3;1;,; ;2;0;1;7 

1;.;1;2;1;8 

1;.;1;1;7;2 

1;.;1;2;2;0 

.... 

Was ich brauche:

May 31, 2017;1.1218;1.1172;1.1220;1.1165;0.30% 

Wenn Sie die Website überprüfen, ist alles in einer Tabelle und ich brauche es ähnlich in CSV. Was sollte ich ändern, damit es funktioniert?

Antwort

0

Make Teillisten der Länge je sechs (= 1 Zeile) von Ihrem row_data Liste (via) legen wird:

with open(save_file, 'wb') as save: 
    writer = csv.writer(save, delimiter=';') 
    for row in [row_data[x:x+6] for x in xrange(0, len(row_data), 6)]: 
     writer.writerow(row) 

#May 31, 2017;1.1242;1.1172;1.1252;1.1165;0.51% 
#May 30, 2017;1.1185;1.1163;1.1207;1.1108;0.18% 
#May 29, 2017;1.1165;1.1177;1.1192;1.1159;-0.16% 
#... 

(Wie erwähnt here, xrange müssen möglicherweise range sein, wenn Sie Python 3 verwenden; Ich bin auf Python 2 und ein Anfänger, also ...)

+0

ich danke Ihnen für Ihre Antwort, es machte das Skript besser, aber jetzt muss ich die zusätzlichen Leerzeilen in der CSV entfernen. Ich habe nur geändert ** 'öffnen (save_file, 'wb')' zu 'öffnen (save_file, 'w')' **. Wie kann ich die zusätzlichen Leerzeilen entfernen? edit: ** @ njoosse ** habe gerade den Link benutzt, um darüber zu lesen, und habe 'lineterminator = '\ n'' verwendet –

+0

@VascoFerreira Hmm warum hast du wb zurück auf b gesetzt? Ich nehme an, Sie können die zusätzlichen Zeilenvorschübe entfernen, indem Sie wie vorgeschlagen "wb" verwenden. (Siehe [hier] (https://stackoverflow.com/questions/23835866/many-tutorials-on-writing-csv-files-have-the-mode-set-to-wb-why)) – lukeA

+0

@VascoFerreira So Lineterminator wäre eine Alternative zu WB? Gut zu wissen. Wenn das Problem gelöst ist, können Sie eine Antwort wählen und sie als gelöst markieren. – lukeA

0

EDIT

Wenn Sie die Zeichenfolgen in der Zeilenliste anfügen, hängen Sie es als eine Liste

row_data.append([row.get_text('data-real-value')])

so dass Sie eine Liste von Listen von Zeichenketten haben.

siehe Python csv library leaves empty rows even when using a valid lineterminator für ein besseres Beispiel.

Halten Sie die writerows wie folgt, um ein einzelnes Element pro Zeile zu drucken.

with open(save_file, 'w') as save: 
     writer = csv.writer(save, delimiter=';') 
     writer.writerows(row) 

, da es das Trennzeichen zwischen jedem Element in der Liste

+0

es funktioniert nicht, die Ausgabe bleibt wie folgt: '31. Mai 2017; 1.1240; 1.1172; 1.1252; 1.1165; 0.49%; 30. Mai 2017; 1.1185; 1.1163; 1.1207; 1.1108; 0.18%; 29. ​​Mai, ' alles in einer Linie. –

+0

hat nur den Link verwendet, um darüber zu lesen, und verwendet 'lineterminator = '\ n'', um die zusätzlichen Leerzeilen zu entfernen. 'writerows (row)' hat nicht funktioniert, aber ich habe die Antwort von @lukeA –

Verwandte Themen