2016-04-18 12 views
0

Ich baue einen einfachen Scraper, um Python zu lernen. Nach dem Schreiben der csvWriter-Funktion unten habe ich Probleme. Es scheint, dass die Kodierung nicht in die CSV-Datei geschrieben werden kann (ich nehme an, dies liegt an den Preisinformationen, die ich schabe).In CSV schreiben - Set vs Liste - UnicodeEncodeError

Auch ich frage mich, ob ich richtig bin in der Annahme, dass es in diesem Fall am besten ist, von Set -> Liste zu gehen, um die Informationen gezippt und präsentiert auf die Art, die ich will vor dem Schreiben.

Auch - irgendwelche allgemeine Hinweise, wie ich mich dem annähere?

from bs4 import BeautifulSoup 
import requests 
import time 
import csv 

response = request.get('http://website.com/subdomain/logqueryhere') 
baseurl = 'http://website.com' 

soup = BeautifulSoup(response.text) 
hotelInfo = soup.find_all("div", {'class': "hotel-wrap"}) 

#retrieveLinks: A function to generate a list of hotel URL's to be passed to the price checker. 
def retrieveLinks(): 
    for hotel in hotelInfo: 
     urllist = [] 
     hotelLink = hotel.find('a', attrs={'class': ''}) 
     urllist.append(hotelLink['href']) 
     scraper(urllist) 

hotelnameset = set() 
hotelurlset = set() 
hotelpriceset = set() 

# Scraper: A function to scrape from the lists generated above with retrieveLinks 
def scraper(inputlist): 
    global hotelnameset 
    global hotelurlset 
    global hotelpriceset 
    #Use a set here to avoid any dupes. 
    for url in inputlist: 
     fullurl = baseurl + url 
     hotelurlset.add(str(fullurl)) 
     hotelresponse = requests.get(fullurl) 
     hotelsoup = BeautifulSoup(hotelresponse.text) 
     hoteltitle = hotelsoup.find('div', attrs={'class': 'vcard'}) 
     hotelhighprice = hotelsoup.find('div', attrs={'class': 'pricing'}).text 
     hotelpriceset.add(hotelhighprice) 
     for H1 in hoteltitle: 
      hotelName = hoteltitle.find('h1').text 
      hotelnameset.add(str(hotelName)) 
      time.sleep(2) 
    csvWriter() 


#csvWriter: A function to write the above mentioned sets/lists to a CSV file. 
def csvWriter(): 
    global hotelnameset 
    global hotelurlset 
    global hotelpriceset 
    csvname = list(hotelnameset) 
    csvurl = list(hotelurlset) 
    csvprice = list(hotelpriceset) 
    #lets zip the values we neded (until we learn a better way to do it) 
    zipped = zip(csvname, csvurl, csvprice) 
    c = csv.writer(open("hoteldata.csv", 'wb')) 
    for row in zipped: 
     c.writerow(row) 

retrieveLinks() 

Fehler ist wie folgt -

± |Add_CSV_Writer U:2 ✗| → python main.py 
Traceback (most recent call last): 
    File "main.py", line 62, in <module> 
    retrieveLinks() 
    File "main.py", line 18, in retrieveLinks 
    scraper(urllist) 
    File "main.py", line 44, in scraper 
    csvWriter() 
    File "main.py", line 60, in csvWriter 
    c.writerow(row) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128) 

Antwort

1

Ihre tatsächliche Fehler Posting wird wirklich helfen! In jedem Fall verschlüsselt der CSV-Writer in Python 2.X nicht automatisch Unicode für Sie. Sie haben im Wesentlichen Ihre eigene mit unicodecsv (https://pypi.python.org/pypi/unicodecsv/0.9.0) oder einer der Unicode CSV-Implementierungen im Web (1) verwenden schreiben:

import unicodecsv 
def csvWriter(): 
    global hotelnameset 
    global hotelurlset 
    global hotelpriceset 
    csvname = list(hotelnameset) 
    csvurl = list(hotelurlset) 
    csvprice = list(hotelpriceset) 
    #lets zip the values we neded (until we learn a better way to do it) 
    zipped = zip(csvname, csvurl, csvprice) 
    with open('hoteldata.csv', 'wb') as f_in: 
     c = unicodecsv.writer(f_in, encoding='utf-8') 
     for row in zipped: 
      c.writerow(row) 
+0

My bad - Ich habe gerade aktualisiert. Danke. – mutantChickenHer0