2009-04-15 8 views
15

Ich versuche, den gesamten HTML-Code aus einer Zeichenfolge zu bereinigen, so dass die endgültige Ausgabe eine Textdatei ist. Ich habe ein paar Nachforschungen über die verschiedenen 'Konverter' angestellt und fange an, mich darauf zu konzentrieren, ein eigenes Wörterbuch für die Entitäten und Symbole zu erstellen und einen Ersatz für die Zeichenfolge auszuführen. Ich denke darüber nach, weil ich den Prozess automatisieren möchte und es gibt eine große Variabilität in der Qualität des zugrunde liegenden HTML. Um zu beginnen, die Geschwindigkeit meiner Lösung und eine der Alternativen zu vergleichen, zum Beispiel pyparsing, entschied ich mich, den Ersatz von \ xa0 mit der String-Methode replace zu testen. Ich erhalte eineSo arbeiten Sie mit Unicode in Python

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128) 

Die eigentliche Codezeile

s=unicodestring.replace('\xa0','') 

war Sowieso-Ich entschied, dass ich brauchte es mit einem r Vorwort so lief ich diese Codezeile:

s=unicodestring.replace(r'\xa0','') 

Es läuft ohne Fehler, aber wenn ich ein Stück s sehe, sehe ich, dass das \ xaO immer noch da ist

+3

Warum würden Sie '\ xa0' mit einem r voranstellen? Das macht es zu einer rohen Zeichenkette - das heißt, es enthält buchstäblich einen umgekehrten Schrägstrich, x, a, 0. Ohne das r enthielt es ein einzelnes Zeichen mit Hexadezimalcode a0, was ich denke, was Sie wollten. –

+0

Weil ich versuchte zu erraten, warum ich den Fehler bekommen habe, und ich weiß, dass manchmal, um das Lesen zu erzwingen, es ein String-Literal machen muss und auch das \ xa0 ist, was tatsächlich in meiner Quelle existiert. Was ist Hex-Code a0? – PyNEwbie

Antwort

25

sein können Sie

tun sollten,
s=unicodestring.replace(u'\xa0',u'') 
+0

Also woher wussten Sie, dies zu tun, da ich dies in keinem Beispiel gesehen habe? Danke – PyNEwbie

+1

Ich denke Strings in einfachen Anführungszeichen sind ascii .. so '\ xa0' wird eine Ausnahme auslösen .. – z33m

3

Schauen Sie sich dieanStandardbibliothek, speziell die codieren und Decodieren Methoden in der Codec-Basisklasse zur Verfügung gestellt. Es gibt auch einen guten Artikel here, der alles zusammenbringt.

+0

Danke-toller Artikel, du hast recht, es bringt viel zusammen. – PyNEwbie

1

Nur ein Hinweis zur HTML-Reinigung. Es ist sehr sehr schwer, da

< 
body 
> 

ist eine gültige Möglichkeit, HTML zu schreiben. Nur ein Fyi.

0

Sie können es konvertieren auf diese Weise Unicode:

print u'Hello, \xa0World' # print Hello, World 
6
s=unicodestring.replace('\xa0','') 

..ist versucht, das Unicode-Zeichen \xa0, zu schaffen, das ist nicht gültig in einem ASCII-String (der Standard-String-Typ in Python bis Version 3.x)

T Er Grund r'\xa0' nicht Fehler ist, weil in einer rohen Zeichenfolge, Escape-Sequenzen keine Wirkung haben. Anstatt zu versuchen, \xa0 in das Unicode-Zeichen zu kodieren, sah es die Zeichenfolge als „Backslash“, „wörtliche x“ und so weiter ..

Die folgenden sind die gleichen:

>>> r'\xa0' 
'\\xa0' 
>>> '\\xa0' 
'\\xa0' 

Dies ist etwas in Python v3 aufgelöst, als Standard-String-Typ ist Unicode, so dass Sie nur tun können ..

>>> '\xa0' 
'\xa0' 

ich versuche, alle HTML aus einer Zeichenfolge zu reinigen, so dass die endgültige Ausgabe ein Text Datei

Ich würde dringend BeautifulSoup dafür empfehlen.Das Schreiben eines HTML-Reinigungswerkzeug ist schwierig (gegeben, wie schrecklich die meisten HTML ist), und BeautifulSoup hat eine große Aufgabe an beiden Parsen HTML, und den Umgang mit Unicode ..

>>> from BeautifulSoup import BeautifulSoup 
>>> soup = BeautifulSoup("<html><body><h1>Hi</h1></body></html>") 
>>> print soup.prettify() 
<html> 
<body> 
    <h1> 
    Hi 
    </h1> 
</body> 
</html> 
+0

Ich weiß diese Antwort zu schätzen. Ich habe BS verwendet, um Daten aus Tabellen zu extrahieren, und es ist sehr nützlich. Es scheint mir jedoch, dass, um den HTML-Code mit BS zu entfernen, ich weiß, was vorhanden ist. Liege ich damit falsch? – PyNEwbie

+0

Ich bin mir nicht sicher, was du meinst? Sie können HTML auf unzählige Arten entfernen, von der ersten Tabelle in einem Div, bis zur Klasse oder ID usw. – dbr

+0

BeautifulSoup.prettyify() war nur ein Lebensretter! Vielen Dank! – Gourneau

2

Statt dessen ist es besser, Standard-Python zu verwenden, Eigenschaften.

Zum Beispiel:

string = unicode('Hello, \xa0World', 'utf-8', 'replace') 

oder

string = unicode('Hello, \xa0World', 'utf-8', 'ignore') 

wo replace\xa0-\\xa0 ersetzen wird.

Aber wenn \xa0 wirklich nicht sinnvoll für Sie ist und Sie es entfernen möchten, dann verwenden Sie ignore.