2017-07-03 8 views
1

Ich versuche, die generierte Liste in eine CSV-Datei zu exportieren, wobei jede Zeile in der Webseitentabelle einer neuen Zeile in der Datei entspricht und jeder Wert in einer einzelnen Zelle steht :Schreiben von Python-Listenwerten in eine CSV-Datei

NAME.....ICO DATE....ICO PRICE....CURR. PRICE....24 HR ROI Stratis.....06/20/16.......$0.007...........$7.480................+38.80%

die aktuelle Ausgabe wie folgt aussieht:

['Patientory\n05/31/17\n$0.104\n$0.274\n+46.11%\n+25.54%\nN/A']

import csv 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait as wait 

csvrows = [] 

def get_css_sel(selector): 
    posts = browser.find_elements_by_css_selector(selector) 
    for post in posts: 
     print(post.text) 
     csvrows.append([post.text]) 

browser = webdriver.Chrome(executable_path=r'C:\Scrapers\chromedriver.exe') 
browser.get("https://icostats.com") 
wait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#app > div > div.container-0-16 > div.table-0-20 > div.tbody-0-21 > div:nth-child(2) > div:nth-child(8)"))) 

get_css_sel("#app > div > div.container-0-16 > div.table-0-20 > div.tableheader-0-50")    #fetch header of table 
get_css_sel("#app > div > div.container-0-16 > div.table-0-20 > div.tbody-0-21 > div")    #fetch rows of table 

def create_csv(thelist): 
    with open('ICO.csv', 'w') as myfile: 
     for i in thelist: 
      wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) 
      wr.writerow([i]) 

create_csv(csvrows) 

Antwort

2

In get_css_sel() jeder post.text enthält die Zeile Text durch Zeilenumbrüche getrennt \n - wie Ihr Blutzuckerwer le der Ausgabe. Wenn Sie also [post.text] anfügen, wird eine Liste mit einem einzelnen Element für die gesamte Zeile angehängt. Ändern Sie diesen an:

csvrows.append(post.text.split('\n')) # remove the extra list brackets 
             # since split returns a list. 

Ex:

>>> y = 'Patientory\n05/31/17\n$0.104\n$0.274\n+46.11%\n+25.54%\nN/A' 
>>> y.split('\n') 
['Patientory', '05/31/17', '$0.104', '$0.274', '+46.11%', '+25.54%', 'N/A'] 

Zusätzlich in Ihrem Schreiben Schleife, sollten Sie nicht neu erstellen csv.writer für jede Zeile, tun Sie es einfach einmal vor über thelist Looping.

Und da Sie alle gewünschten Zeilen in csvrows haben, können Sie csvwriter.writerows direkt verwenden.

def create_csv(thelist): 
    with open('ICO.csv', 'w') as myfile: 
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) 
     wr.writerows(thelist) 
+0

Das ist es! Wie kann ich die Anführungszeichen entfernen? Ich kann remove() nicht aufrufen: AttributeError: 'NoneType' -Objekt hat kein Attribut 'remove' – tklein

+0

Welche Anführungsstriche möchten Sie entfernen? In der CSV-Datei haben Sie "quoting = csv.QUOTE_ALL" angegeben. Entfernen Sie das, wenn Sie keine unnötigen Anführungszeichen benötigen. Außerdem ist der [Standard "Dialekt" "Excel"] (https://docs.python.org/3/library/csv.html#csv.writer), was normalerweise ausreichend ist. – aneroid

+0

Wenn Sie leere Zeilen und keinen Text für 'post.text' erhalten, dann setzen Sie' if post.text: 'vor' csvrows.append ... '. – aneroid

1

Versuchen Sie diesen Code:

import csv 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait as wait 

csvrows = [] 
def get_css_sel(selector): 
    posts = browser.find_elements_by_css_selector(selector) 
    for post in posts: 
     print(post.text) 
     csvrows.append(post.text) 

browser = webdriver.Chrome(executable_path=r'//Users/Pranavtadepalli/Downloads/chromedriver') 
browser.get("https://icostats.com") 
wait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#app > div > div.container-0-16 > div.table-0-20 > div.tbody-0-21 > div:nth-child(2) > div:nth-child(8)"))) 

get_css_sel("#app > div > div.container-0-16 > div.table-0-20 > div.tableheader-0-50")    #fetch header of table 
get_css_sel("#app > div > div.container-0-16 > div.table-0-20 > div.tbody-0-21 > div")    #fetch rows of table 
new=[",".join(elem.split("\n")) for elem in csvrows] 
newfile=open("csvfile.csv",'r') 
newfile1=open("csvfile.csv",'w') 
newstuff=newfile.read() 
for elem in new: 
    newfile1.write(elem+'\n') 
newfile1.close() 
newfile.close()