2016-12-18 1 views
0

ich nach einem Udacity Kurs einen Crawler in Python zu machen versuchen. Ich habe diese Methode get_page(), die den Inhalt der Seite zurückgibt.UnicodeDecodeError: 'utf-8' Codec kann nicht Byte 0x8B in Position dekodieren 1: ungültiger Start-Byte

def get_page(url): 
    ''' 
    Open the given url and return the content of the page. 
    ''' 

    data = urlopen(url) 
    html = data.read() 
    return html.decode('utf8') 

die ursprüngliche Methode nur zurückkehrt data.read(), aber auf diese Weise kann ich nicht Operationen wie str.find() tun. Nach einer kurzen Suche habe ich herausgefunden, dass ich die Daten entschlüsseln muss. Aber jetzt bekomme ich diesen Fehler

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Ich habe ähnliche Fragen in SO gefunden, aber keiner von ihnen war speziell dafür. Bitte helfen Sie.

+0

Können Sie mich wissen lassen, was der 'url' Wert ist? – falsetru

+0

könnte es eine beliebige URL sein. In diesem Fall war es google.co.in –

+0

Entsprechend der Überschrift wird die Seite mit 'ISO-8859-1', nicht' utf-8' kodiert. – falsetru

Antwort

0

Sie versuchen, eine ungültige Zeichenfolge zu entschlüsseln. Das Startbyte einer gültigen UTF-8-Zeichenfolge muss im Bereich von 0x00 bis 0x7F liegen. So 0x8B ist auf jeden Fall ungültig. Von RFC3629 Section 3:

In UTF-8, characters from the U+0000..U+10FFFF range (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets. The only octet of a "sequence" of one has the higher-order bit set to 0, the remaining 7 bits being used to encode the character number.

Sie sollten die Zeichenfolge schreiben Sie zu entschlüsseln versuchen.

+0

das ist eigentlich eine Webseite. Wenn ich zum Beispiel http://google.co.in als "URL" übergebe, erhalte ich diesen Fehler > UnicodeDecodeError: 'utf-8' Codec kann Byte 0xa0 in Position 9862 nicht dekodieren: ungültiges Startbyte –

0

Vielleicht wird die Seite mit anderer Zeichencodierung codiert wird, sondern ‚UTF-8‘. Also das Startbyte ist ungültig. Sie könnten dies tun.

def get_page(self, url): 
    if url is None: 
     return None 
    response=urllib.request.urlopen(url) 
    if response.getcode()!=200: 
     print("Http code:",response.getcode()) 
     return None 
    else: 
     try: 
      return response.read().decode('utf-8') 
     except: 
      return response.read() 
Verwandte Themen