Schöne Suppe und Unicode-Probleme

7

Ich verwende BeautifulSoup, um einige Webseiten zu analysieren.

Gelegentlich laufe ich in einen "Unicode-Fehler" wie folgt:

Mit Blick auf die Quelle dieses Artikels auf TheAtlantic.com [ Ссылка ]

Das sehen wir in der og: description Meta Eigenschaft:

%Vor%

Wenn BeautifulSoup es analysiert, sehe ich Folgendes:

%Vor%

Wenn ich versuche, es in UTF-8 zu kodieren, so sagt dieser Kommentar: Ссылка

%Vor%

Gerade als ich dachte, dass ich alle meine Unicode-Probleme unter Kontrolle habe, verstehe ich immer noch nicht ganz, was vor sich geht, also werde ich ein paar Fragen aufstellen:

1- Warum würde BeautifulSoup das &nbsp; in \xa0 [ein lateinisches Zeichenraumzeichen] konvertieren? Der Zeichensatz und die Header auf dieser Seite sind UTF-8, ich dachte, dass BeautifulSoup diese Daten für die Kodierung zieht? Warum wurde es nicht durch <space> ersetzt?

2- Gibt es eine allgemeine Möglichkeit, Leerzeichen für die Konvertierung zu normalisieren?

3- Wenn ich nach UTF8 codiert habe, wo ist \xa0 zur Folge von \xc2\xa0 geworden?

Ich kann alles durch unicodedata.normalize('NFKD',string) pipen, um mir zu helfen, wo ich hin will - aber ich würde gerne verstehen, was los ist, und ein Problem wie dieses in der Zukunft vermeiden.

    
Jonathan Vanasco 22.10.2013, 03:23
quelle

1 Antwort

21

Sie haben kein Problem. Alles verhält sich wie beabsichtigt.

&nbsp; zeigt einen nicht-brechenden Space-Charakter an. Dies wird nicht durch ein Leerzeichen ersetzt, da es kein Leerzeichen darstellt. es stellt einen geschützten Raum dar. Ersetzen Sie es durch ein Leerzeichen würde Informationen verlieren: das, wo dieser Raum auftritt, sollte eine Text-Rendering-Engine keinen Zeilenumbruch setzen.

Der Unicode-Codepunkt für nicht-brechenden Speicherplatz ist U + 00A0, der in einer Unicode-Zeichenfolge in Python als \xa0 geschrieben ist.

Die UTF-8 Kodierung von U + 00A0 ist in hexadezimaler Form die Zwei-Byte-Sequenz C2 A0, oder in eine Python-String-Repräsentation geschrieben, \xc2\xa0 . In UTF-8 benötigt alles, was über den 7-Bit-ASCII-Satz hinausgeht, zwei oder mehr Bytes, um es darzustellen. In diesem Fall ist das höchste Bit das achte Bit. Das heißt, dass es durch die Zwei-Byte-Sequenz (binär) dargestellt werden kann 110xxxxx 10xxxxxx , wobei die x die Bits der binären Darstellung des Codepunkts sind. Im Fall von A0 ist das 10000000 oder, wenn in UTF-8 codiert, 11000010 10000000 oder C2 A0.

Viele Leute verwenden &nbsp; in HTML, um Leerzeichen zu erhalten, die nicht durch die üblichen HTML-Whitespace-Kollabierungsregeln (in HTML werden alle Läufe von aufeinanderfolgenden Leerzeichen, Tabulatoren und Zeilenumbrüche als ein einziges Leerzeichen interpretiert werden, es sei denn eines der CSS white-space -Regeln werden angewendet, aber das sind sie nicht wirklich bestimmt für; sie sollen für Dinge wie Namen verwendet werden, wie "Mr. Miyagi", wo Sie nicht wollen, dass es einen Zeilenwechsel zwischen dem "Mr." gibt und "Miyagi". Ich bin nicht sicher, warum es in diesem speziellen Fall verwendet wurde; es scheint hier fehl am Platz, aber das ist eher ein Problem mit Ihrer Quelle, nicht der Code, der es interpretiert.

Nun, wenn Sie sich nicht wirklich um Layout kümmern, so dass es Ihnen nichts ausmacht, ob Textlayoutalgorithmen dies als einen Platz zum Umbrechen auswählen, sondern dies nur als einen regulären Platz interpretieren möchten, ist die Normalisierung mit NFKD eine vollkommen vernünftige Antwort (oder NFKC, wenn Sie vorkomponierte Akzente zu zerlegten Akzenten bevorzugen). Die NFKC- und NFKD-Normalisierungen bilden Zeichen so ab, dass die meisten Zeichen, die in den meisten Kontexten im Wesentlichen den gleichen semantischen Wert darstellen, erweitert werden. Zum Beispiel werden Ligaturen expandiert (ffi - & gt; ffi), archaische lange s Zeichen werden in s (s - & gt; s) umgewandelt, Zeichen mit römischen Zahlen werden in ihre individuellen Buchstaben (Ⅳ - & gt; IV) und nicht erweitert -Brechraum in einen normalen Raum umgewandelt. Bei einigen Zeichen kann die NFKC- oder NFKD-Normalisierung Informationen verlieren, die in einigen Kontexten wichtig sind: ℌ und ℍ normalisieren beide auf H, können aber in mathematischen Texten verwendet werden, um auf verschiedene Dinge Bezug zu nehmen.

    
Brian Campbell 22.10.2013, 03:41
quelle

Tags und Links