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!

  • Lesen Sie automatisch den Text von Minecraft
  • Mechanize für Python 3.x
  • BeautifulSoup get_text nicht alle Tags und JavaScript
  • Mit Python schaben?
  • Wie kann man Mechanisieren nicht mit Formularen auf dieser Seite ausfallen?
  • Einen Tisch schieben mit BeautifulSoup
  • Scaping von Javascript-generierten Daten mit Python
  • Scrapy Python Set User User
  • 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) 
    Python ist die beste Programmiersprache der Welt.