Python Skript: HTML in Txt Datei konvertieren (wie in Internet Explorer)

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
stiner313
User
Beiträge: 12
Registriert: Samstag 28. Januar 2017, 09:52

Hallo Zusammen,

ich habe jetzt wirklich lange nach einer Lösung zu meinem Problem gesucht, aber nicht genau das gefunden was ich brauche.
Vielleicht kann mir jemand von euch weiterhelfen.

Ich bekomme aus einem externen Programm ein HTML-Protokoll und kann dieses im Browser öffnen.
Ich möchte nun das HTML-Protokoll weiterverarbeiten (letzer Schritt ist eine Excel-Tabelle) das passiert momentan auf diesem Weg:

Schritt 1:
Öffnen der HTML-Datei im Internet-Explorer und Datei speichern als .txt Datei (Unicode) (händisch!)
Schritt 2:
Python Skript liest Zeilen der .txt Datei ein und ich kann alles mögliche an String-Manipulationen durchführen.

Ich möchte nun allerdings den Schritt 1 weglassen (zu viel händischer Aufwand).

Wenn ich die Datei im Brower öffne und dann als .txt Datei abspeichere wird ja nicht nur der Inhalt in ein .txt überführt sondern die Datei auch konvertiert.

Alles was ich bisher finde ist aber nur den Text aus dem HTML direkt in ein Txt zu speichern was ja nicht das ist was ich möchte.
Ich möchte mich bei der Lösung auf die im Spyder (Anaconda) enthaltenen Bibliotheken beschränken.

Leider komme ich hier seit Tagen nicht weiter...

Wäre es möglich die Konvertierung mit dem Browser im Python Skript automatisiert durchzuführen oder gibt es sogar noch eleganter Lösungen?


Ich wäre wirklich froh über jede Hilfe.

Beste Grüße,
stiner313
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Benutz BeautifulSoup, um die Verarbeitung selbst zu machen. Das ist zwar zu Beginn etwas aufwaendiger, weil der IE und sein Text-Export schon irgendwelche Heuristiken implementiert haben, die dir gerade zu passe kommen. Den Browser fernzusteuern ist verfuehrerisch, aber auch sehr fragil, gerade in diesem Bereich, der mit klassischer Webentwicklung nichts zu tun hat.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und dann am besten die get_text()-Methode benutzen:
https://www.crummy.com/software/Beautif ... /#get-text
stiner313
User
Beiträge: 12
Registriert: Samstag 28. Januar 2017, 09:52

Hallo zusammen,
erst einmal danke für die Antworten.

Eine einfache Möglichkeit außer sich in BeatifulSoup einzuarbeiten gibt es nicht? Mein ganzer Code basiert momentan auf dem auslesen vom Text File danach, sodass das vermutlich eine riesen Arbeit wäre das alles umzuschreiben.

Ich habe auch die Bibliothek gar nicht im anaconda Paket mit drin sodass das für die Anwendung von Kollegen wieder etwas schwierig vermittelbar ist. Habe mit dem installieren einzelnen Pakete leider auch wenig Ahnung da ich sonst immer nur die Standard Sachen nutze.

Zur Info noch: ich nutze nach wie vor Python 2.7

Beste Grüße
Stiner313
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Bezüglich Anaconda:
https://anaconda.org/anaconda/beautifulsoup4

Und hast du meinen Link zur get_text()-Methode überhaupt mal angeschaut? Das ist eine ziemliche Erleichterung im Gegensatz zur "manuellen" Herangehensweise. Ich selbst bin auch kein Freund davon, mich (und andere Anwender) für jede Kleinigkeit von einer Drittbibliothek abhängig zu machen. Aber BS ist echt gängig und auch leicht installierbar. Wenn du jedoch nicht möchtest, dann kann dich natürlich keiner zwingen. Das ist klar. Dann leb aber auch mit den Umständen, ähnlich wie bei deiner Weiternutzung einer nicht mehr unterstützen Python-Version.
stiner313
User
Beiträge: 12
Registriert: Samstag 28. Januar 2017, 09:52

Hallo, Dankeschön nochmal für deine Rückmeldung. Den Link hab ich mir selbstverständlich angesehen wollte aber bevor ich mich in das Thema vertiefe nach anderen möglichen Wegen erkundigen.

Bevor du jedoch so eine komische Wortwahl verwendest würde ich mich erst einmal erkundigen warum man denn auf Python 2.7 angewiesen ist und nicht Python 3 nutzen kann. In meinem Falle bin ich nämlich ein Berechnungsingenieur der die Software Abaqus verwendet und hier nur Python 2.7 zur Verfügung hat.

Vielen Dank für deine erneute Rückmeldung.

Grüße
Stiner313
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@stiner313: Komische Wortwahl? Python 2 wird von den Entwicklern nicht mehr unterstützt, das heisst unter anderem auch, dass es keine Sicherheitsupdates mehr gibt. Der Wechsel nach Python 3 ist schon seit Jahren absehbar und einige grössere Projekte, die auch mit Anaconda installierbar sind, liefern schon eine Weile keine aktuellen Versionen mehr für Python 2.

Eine Übersicht gibt's hier: https://python3statement.org/
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@stiner313
Dass es einen triftigen Grund für die Weiternutzung einer veralteten Programmversion gibt, hat man ja häufiger, weil man andere Abhängigkeiten beachten muss und damit nicht immer so leicht wechseln kann. Das überrascht also nicht wirklich, ändert aber auch so gar nichts an meiner Aussage. Das Thema nennt sich Software-Schulden (oder allgemeiner: Technische Schulden) und ist dann halt leider doof. Du fragtest zuvor nach einer einfachen Alternative, um dein Problem mit den bestehenden Boardmitteln zu lösen: Es gibt dann leider keine. Zumindest keine schöne. Bau dir halt irgendwas mit regulären Ausdrücken und den str-Methoden.

Achso, Python hat in der Standardbibliothek einen Parser für Webseiten, der aber erst ab Python 3 wirklich brauchbar geworden ist. Die Python 2 Version kommt mit "Alltags-HTML" nicht wirklich gut klar. Aber probieren könntest du es natürlich mal damit. Ansonsten vielleicht den Code von BS kopieren bzw das Paket einfach in deinem Projekt mit ausliefern. Ist an sich nicht so schön, weil man harte Abhängigkeiten vermeiden sollte, wäre aber IMHO als Notlösung denkbar.
stiner313
User
Beiträge: 12
Registriert: Samstag 28. Januar 2017, 09:52

Hallo Zusammen,

danke nochmal für die Rückmeldungen.

Das mit Anaconda und Beatiful Soup müsste ich nochmal nachschauen meine aber das mal versucht zu haben.
Ich verstehe die Hinweise zu Python 2 vs. 3 vollkommen und habe auch öfter darüber gelesen.

Trotzdem sollte das Python Skript nur etwas sein, was die Arbeit etwas verschnellert um die Daten direkt in Excel zu haben.
Ich dachte wirklich es gibt einen einfachen weg z. B. über Subprocess den Internet Explorer anzusteuern und diesen zu nutzen ein Text-File zu generieren.
Da bin ich aber nicht der Experte und verlasse mich darauf, dass sich in BeatifulSoup einzuarbeiten der einzige vernünftige Weg ist.

Dann wird das ganze zwar lange dauern aber wenn es ein eleganter Weg ist wird das schon der sinnvollere sein.

Ich würde den Thread jedoch erstmal gerne offen lassen falls ich auf Probleme stoße.

Falls jemand doch noch andere Lösungen hat wäre ich froh über Anregungen.

Beste Grüße,
stiner313
stiner313
User
Beiträge: 12
Registriert: Samstag 28. Januar 2017, 09:52

Hallo Nochmal,

so ein bisschen Zeit dafür genommen und schon hat es geklappt.
BeautifulSoup war hier wirklich eine elegante Lösung.

Mein Code ist zwischen tr tags und h2 tags drin und diese suche ich mir aus dem gesamten Objekt.

Code: Alles auswählen

lines=[]
tr_tags=soup.find_all(re.compile(r'(tr|h2)'))
for i in tr_tags:
    string = i.get_text().encode('utf-8')
    lines.append(string.replace('\t', '').replace('\n', ' ').strip())
Ich musste bei der get_text Methode noch den Befehl encode('utf-8') anhängen.
Ohne den Befehl bekomme ich als str zum Beispiel: u'Ma\xdfgebliche
Mit dem Enconde wird dies zu: 'Ma\xc3\x9fgebliche

Wenn ich jetzt in meiner Liste lines nach "Maßgebliche" im String suche findert er das zwar immer noch nicht aber wenn ich nach 'Ma\xc3\x9fgebliche suche findet er das.
Weiß noch jemand wie man diese komische Eigenart in den Griff bekommt?

Beste Grüße,
stiner313
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso glaubst du, du musst das machen? Und wie und wo suchst du nach "Maßgebliche"?
stiner313
User
Beiträge: 12
Registriert: Samstag 28. Januar 2017, 09:52

Ich weiß dass der interessante Wert den ich suche (bei mir eine Hauptspannung) immer mit dem Wort Maßgebliche in der Zeile anfängt.
Wenn ich statt line.startswith('Maßgebliche') eingebe springt er nicht in die if Bedingung.

print(repr(...)) gibt mir dann statt Maßgeblich Ma\xc3\x9fgeblich aus.
Wenn ich das dann auch so eingebe findet er es auch.

Code: Alles auswählen

for line in lines:
    if line.startswith('Ma\xc3\x9fgebliche'):
        string= re.findall (...)
Zuletzt geändert von stiner313 am Freitag 24. April 2020, 14:07, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Problem ist, dass Du Python2 benutzt, und das Dich nicht daran hindert, mit Encoding völligen Quatsch zu machen.
Auch mit Python2 kann man schon ordentlich mit Unicode-Strings umgehen, man muß nur ein u davorhängen: u"Maßgebliche"
`i` ist ein sehr schlechter Name für in tr oder h2-Element.

Code: Alles auswählen

lines=[]
tr_elements = soup.find_all(re.compile(r'(tr|h2)'))
for element in tr_elements:
    lines.append(element.get_text().strip().replace(u'\t', u'').replace(u'\n', u' '))
und dann:

Code: Alles auswählen

for line in lines:
    if line.startswith(u"Maßgebliche"): ...
stiner313
User
Beiträge: 12
Registriert: Samstag 28. Januar 2017, 09:52

Das kommt daher, da ich noch nie mit Unicode stirngs zu tun hatte ich kenne bis jetzt nur die "normalen" strings und die Manipulationen davon.
Danke aber für diesen Hinweis.

Ich habe auch das getestet und es funktioniert wirklich so.

Ich danke für die ganzen hilfreichen Anregungen.
Damit stehen mir jetzt nochmals viele andere Möglichkeiten offen Dingen eleganter zu lösen.

Das Thema ist für mich erledigt. Vielen Dank!

Beste Grüße,
stiner313
Antworten