2016-07-20 33 views
4

Die Lösungen in anderen Antworten funktionieren nicht, wenn ich sie versuche, die gleiche Zeichenfolge ausgibt, wenn ich diese Methoden ausprobiere.Dekodierung kaufmännischer Hash-Zeichenfolgen (& # 124 & # 120 & # 97) usw.

Ich versuche Web Scraping mit Python 2.7 zu tun. Ich habe die Webseite heruntergeladen und es hat einige Zeichen, die in der Form &#120 sind, wobei 120 den ASCII-Code zu repräsentieren scheint. Ich versuchte mit HTMLParser() und decode() Methoden, aber nichts scheint zu funktionieren. Bitte beachten Sie, dass ich von der Webseite im Format nur diese Zeichen habe. Beispiel:

&#66&#108&#97&#115&#116&#101&#114&#106&#97&#120&#120&#32 

Bitte leite mich diese Strings mit Python zu entschlüsseln. Ich habe die anderen Antworten gelesen, aber die Lösungen scheinen nicht für mich zu funktionieren.

+0

Sie sind nicht gültig [Zeichenreferenzen] (https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_reference_overview): sie das abschließende Semikolon fehlen. Aber sobald diese Semikolons hinzugefügt sind, dekodiert das Beispiel zu "Blasterjaxx" –

+3

Versuchen Sie, Codierung explizit anzugeben, während Sie diese Seiten herunterladen – frist

Antwort

4

Je nachdem, was Sie tun, können Sie möchten, dass die Daten gültig konvertieren HTML character references so können Sie es im Zusammenhang mit einem richtigen HTML-Parser analysieren.

Es ist jedoch einfach genug, die Zahlenfolgen zu extrahieren und sie selbst in die entsprechenden ASCII-Zeichen umzuwandeln. ZB

s ='&#66&#108&#97&#115&#116&#101&#114&#106&#97&#120&#120&#32' 
print ''.join([chr(int(u)) for u in s.split('&#') if u]) 

Ausgang

Blasterjaxx 

Die if u überspringt die anfängliche leere Zeichenkette, die wir bekommen, weil s mit der Aufspaltung String '&#' beginnt. Alternativ können wir es durch Schneiden überspringen könnte:

''.join([chr(int(u)) for u in s.split('&#')[1:]]) 
3

Das korrekte Format für die Zeichenreferenz lautet &#nnnn;, daher fehlt in Ihrem Beispiel die ;. Sie können die ; hinzufügen und dann verwenden HTMLParser.unescape():

from HTMLParser import HTMLParser 
import re 
x ='&#66&#108&#97&#115&#116&#101&#114&#106&#97&#120&#120&#32' 
x = re.sub(r'(&#[0-9]*)', r'\1;', x) 
print x 
h = HTMLParser() 
print h.unescape(x) 

Dieser diesen Ausgang gibt:

Blasterjaxx  
Blasterjaxx