Das Schaben funktioniert gut, bis ich diesen Fehler bekomme: 'ascii' Codec kann das Zeichen nicht 'u' \ u2122 'in Position kodieren

Ich habe nur ein paar Wochen Python Training, also vermute ich, dass es eine einfache Lösung für dieses Problem gibt. Aber für mich ist es ziemlich frustrierend und nach der Arbeit an diesem für mehrere Stunden frage ich Sie jetzt um Hilfe!

Die Website, die ich versuche zu kratzen, ist gut organisiert (siehe https://twam2dcppennla6s.onion.to/ ), und der Code, den ich geschrieben habe, kratzt etwa die Hälfte der 26 Seiten, bis ich diese Fehlermeldung bekomme:

Traceback (most recent call last): File "SR2works4real2.py", line 18, in <module> csvWriter.writerows(jsonObj['vendors']) File "/usr/lib/python2.7/csv.py", line 154, in writerows return self.writer.writerows(rows) UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 8: ordinal not in range(128) 

Mein Code ist:

 import urllib2, json,csv htmlTxt="" urlpart1='https://twam2dcppennla6s.onion.to/vendors.php?_dc=1393967362998&start=' pageNum=0 urlpart2='&limit=30&sort=%5B%7B%22property%22%3A%22totalFeedback%22%2C%22direction%22%3A%22DESC%22%7D%5D' csvFile=open('S141.csv','wb') csvWriter=csv.DictWriter(csvFile,['name','vendoringTime','lastSeen','avgFeedback','id','totalFeedback','united','shipsTo','shipsFrom'],delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) csvWriter.writeheader() while htmlTxt != "{\"vendors\":[]}": print("Page "+str(pageNum)+"...") pageNum+=30 response=urllib2.urlopen((urlpart1)+str(pageNum)+(urlpart2)) htmlTxt=response.read() htmlTxt.encode('utf-8') jsonObj=json.loads(htmlTxt) csvWriter.writerows(jsonObj['vendors']) #print(str(jsonObj)) csvFile.close() 

Ich hoffe, da ist jemand da draußen, der helfen kann!

2 Solutions collect form web for “Das Schaben funktioniert gut, bis ich diesen Fehler bekomme: 'ascii' Codec kann das Zeichen nicht 'u' \ u2122 'in Position kodieren”

Das ist Unicode für das Markenzeichen: http://www.marathon-studios.com/unicode/U2122/Trade_Mark_Sign

Da du das Web kratzst, wirst du wahrscheinlich noch viel mehr von diesen Fehlertypen sehen, also ersetze es für diese Seite, aber nicht andere mit anderen Symbolen.

Das csv-Modul konvertiert Ihren Unicode zu ascii, bevor er es schreibt. Ich würde Ihnen empfehlen, dasselbe zu tun, bevor Sie ihm den Text geben, und reinigen Sie sich selbst, das heißt, statt

 htmlTxt.encode('utf-8') 

machen

 htmlTxt.encode('ascii', 'ignore') 

Und dann schau dir den Text an, um zu sehen, ob es für deine Zwecke akzeptabel ist.

BEARBEITEN

Hier ist meine Ausgabe in Python 3:

 >>> u'\u2122'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character '\u2122' in position 0: ordinal not in range(128) >>> u'\u2122'.encode('ascii', 'ignore') b'' 

Und Python 2.6:

 >>> u'\u2122'.encode('ascii') Traceback (most recent call last): File "<pyshell#92>", line 1, in <module> u'\u2122'.encode('ascii') UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128) >>> u'\u2122'.encode('ascii', 'ignore') '' 

Die Strings in jsonObj werden im unicode Typ sein, da das Python- json Modul Unicode-Strings erzeugt. Ihr Csv-Schriftsteller will alles in str Typ. In Python 2.7 wird es versuchen, automatisch konvertieren unicode Typ in str Typ unter der Annahme ASCII. Dies wird natürlich fehlschlagen, wenn der Unicode-Typ keine ASCII enthält.

Die einfachste Lösung wäre, diese Zeile zu ändern:

 csvWriter.writerows(jsonObj['vendors']) 

Um den Unicode in str in utf8 zu verschlüsseln, kurz bevor er an csv writer sendet. jsonObj['vendors'] ist eine Liste von Wörterbüchern mit Unicode-Schlüsseln und Werten, also können wir dies tun:

 unicode_vendors = jsonObj['vendors'] str_vendors = [] for unicode_dict in unicode_vendors: str_dict = {} for key, value in unicode_dict.items(): str_dict[key.encode('utf8')] = value.encode('utf8') if value else value str_vendors.append(str_dict) csvWriter.writerows(str_vendors) 
  • Web-Scraping Informationen außer Preis von Yahoo Finance in Python 3
  • Python und Mechanize verwenden, um Formulardaten zu übermitteln und zu authentifizieren
  • Kann man scrapy verwenden, um dynamische Inhalte von Webseiten zu kratzen, die AJAX verwenden?
  • Warum kratzt man einen Fehler für mich, wenn man versucht, eine Seite zu spinnen und zu analysieren?
  • Ausschließlich unerwünschte Ergebnisse von findAll mit BeautifulSoup
  • Wie kann man Mechanisieren nicht mit Formularen auf dieser Seite ausfallen?
  • Schälen von Ajax-Seiten mit Python
  • Einen Tisch schieben mit BeautifulSoup
  • Python ist die beste Programmiersprache der Welt.