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!

  • Kann man scrapy verwenden, um dynamische Inhalte von Webseiten zu kratzen, die AJAX verwenden?
  • Kann man auf diese Seite werfen, die aktiv neu berechnet wird?
  • Wie man Text innerhalb des Schriftart-Tags mit beautifulsoup extrahiert
  • Warum kratzt man einen Fehler für mich, wenn man versucht, eine Seite zu spinnen und zu analysieren?
  • Schaben mehrere paginierte Links mit BeautifulSoup und Requests
  • Python-HTML-Schaben
  • Beautifulsoup erhält Wert in der Tabelle
  • Kratzen mit mehreren POST-Daten aus der gleichen URL
  • 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.