BeautifulSoup - Deutsche Buchstaben im html code

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RC_data
User
Beiträge: 4
Registriert: Montag 2. Februar 2015, 11:56

Guten Tag zusammen,

ich habe arbeite gerade an einem Projekt bei dem ich mir einen HTML-Code mit beautiful soup ziehe.

In dem HTML-Code werden Deutsche Umlaute (z.B. wie in Bär, oder für) als ü oder andere Zeichenfolgen wieder gegeben.

Da ich in dem HTML-Code aber nach Worten suche die Umlaute enthalten, gibt mir Python immer einen Fehlercode.

Für das Fortschreiten in meinem Projekt benötige ich eine Lösung um die Umlaute, bzw. die codierten in vokale umzuwandeln. D.h. aus ü wird ue aus ä ae etc.

Ich habe bereits alle Foren abgesucht und selber umgebestelt, aber keine wirklichen Resultate gefunden.

Hilfe wäre hier super! und ja ich weis ich bin eine Python newbie, d.h. gerade 2-Tage Erfahrung

Besten Gruß

RC_Data
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Als erstes empfehle ich die Lektüre der verlinkten Artikel in meiner Signatur ;-)

Als nächstes stellt sich die Frage, ob die verkrüppelten Zeichen wirklich im HTML-Dokument so enthalten sind oder Du sie einfach falsch interprtierst? Im ersten Falle hast Du ziemliches Pech, denn du bekommst fehlerhaften Inhalt. Im zweiten Fall musst Du lediglich sauber zwischen Unicode und Bytecode trennen; insbesondere auch bei (impliziten) Wandlungen für Ausgaben.

Bist Du sicher, dass Du die Umlaute in Vokalkombinationen wandeln willst? Wozu soll das dienen? (Was ist der spätere Zweck davon?) Was soll bei Nicht Vokalen passieren? ("ß" o. andere Unicode-zeichen?)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
RC_data
User
Beiträge: 4
Registriert: Montag 2. Februar 2015, 11:56

Vielen Dank für die Antowort. Ich werde mir die Lektüren mal zugemüte führen.

hierzu Deiner Antwort:

1. der HTML-Code enthält noch umlaute. Für die Anzeige (print htmltext) werden die Zeichen umgewandelt.
2. Der spätere Zweck ist die gefilterten Textinformation als Suchstichwörter zu verwenden. Umlaute sind hier auch in Ordnung, falls es python, bzw. ich damit umgehen kann.

MfG
BlackJack

@RC_data: Für die Anzeige mit ``print`` wandelst *Du* die Umlaute auch *explizit* selber um und zwar in die Kodierung die von dem Programm erwartet wird welches letztendlich die Anzeige vornimmt?
RC_data
User
Beiträge: 4
Registriert: Montag 2. Februar 2015, 11:56

Aha. Ich verwende sublime text zur Anzeige. Hoffe ich habe geschnallt was du gemeint hast.
RC_data
User
Beiträge: 4
Registriert: Montag 2. Februar 2015, 11:56

So. Ich denke ich kann den Fall jetzt nochmal klarer beschreiben, so dass klar wird wo die Lücke zur Hilfe besteht. Hier ein Snippet

Code: Alles auswählen

#-*- coding: iso-8859-1 -*-
import urllib
import mechanize
from bs4 import BeautifulSoup
import re
import codecs
import unicodedata

from bs4 import BeautifulStoneSoup
import cgi

#_______ENCODING TO utf-8________
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders=[('User-agent','chrome')]
htmltext_II = br.open('http://www.andinet.de/lustiges/geschichten/dau.php').read() # diese URL ist nur ein Beispiel

print htmltext_II
Wenn ich htmltext_II nun in sublime text 2 printe in erhalte ich "Drücken", statt "Drücken", für "könnten" für könnten.

Mein Vorhaben ist nun:

1. Die Namen aus dem html text extrahieren. Diese Namen können Umlaute enthalten.
2. Anschließend in eine Excel bzw. Textdateizu exportieren.

Ich denke für schritt 1. sollte ich Sie in unicode lassen. Für Schritt 2 würde ich sie gerne wieder in Umlaute umwandeln.

Wie wandel ich den html Text in unicode ? Wie wandel ich unicode in normalen text mit deutschen Umlauten.

Ich will an dieser Stelle nicht aufgeben, da ich so kurz vorm Ziel bin!

LG
BlackJack

@RC_data: Als erstes solltest Du das ``reload(sys)`` und den `sys.setdefaultencoding()` weglassen. Das hat einen Grund warum die Funktion nicht beim normalen importieren des `sys`-Moduls existiert. Die Python-Entwickler haben die absichtlich entfernt damit die nicht vom Programmierer einer Anwendung aufgerufen werden kann.

In Schritt 1 irgendwass in Unicode belassen funktioniert nur wenn das überhaupt Unicode ist. Über Netzwerkverbindungen gehen Bytes und keine Texte. Und wie die Texte in einem beliebigen Dokument im Netz kodiert sind, legt derjenige fest der das HTML geschrieben hat, beziehungsweise der Server oder die Webanwendung in welcher Kodierung sie das HTML ausliefert.

Du versuchst da aber sehr wahrscheinlich ein Problem zu lösen was gar keines ist, wenn Du die Daten denn erst mal weiterverarbeitest. Denn BeautifulSoup sollte sich eigentlich um das dekodieren kümmern und Unicode-Objekte liefern. Und dabei dann auch gleich Charackter-Entities auflösen, die in HTML ja auch vorkommen können, selbst wenn der HTML-Text selbst als reines ASCII kodiert wäre.

Die entsprechenden Bibliotheken zum schreiben von Excel-Dateien müsste man direkt mit Unicode-Objekten füttern können. Beim Schreiben in eine Textdatei müsstest Du dann dafür sorgen dass der Text vorher in Bytes kodiert wird. Denn genau wie bei Netzwerkverbindungen können Dateien keinen Text sondern nur Bytes.
Antworten