Kodierung von html zu json

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
vertretung
User
Beiträge: 20
Registriert: Sonntag 11. August 2019, 09:06

Hallo zusammen,
ich habe ein kleines Kodierungsproblem..kann mir jemand sagen, wieso mir hier keine Umlaute angezeigt werden?

Code: Alles auswählen

import requests
import json

URL = "https://list-gymnasium.de/vertretungsplan/upload/Vertretungen-Sa.html"
r = requests.get(URL)
r.encoding = 'utf-8'  
htmlcode = r.text
with open('datas.json',  'w', encoding='utf-8') as outfile:
    json.dump(htmlcode, outfile)
Ein Teil der Ausgabe:

Code: Alles auswählen

"white-space:normal\">Raum\ufffdnderung</td>\r\n</tr>\r
Hab ich da was mit den Kodierungen vergessen?
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

Nicht-Ascii-Zeichen werden standardmäßig escaped; das ist, was du dort sieht. Daran musst du eigentlich auch nichts ändern. Siehe dazu auch den Parameter 'ensure_ascii': https://docs.python.org/3/library/json.html#json.dump

Ansonsten frage ich mich, weshalb du HTML als JSON serialisierst. Das ergibt meiner Meinung nach so wenig Sinn.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie kommst Du drauf, dass das Encoding `utf-8` wäre? Der Server liefert kein Encoding, so dass man in den HTML-Code schauen muß. Im meta-Tag steht dann auch, welches das richtige Encoding ist.

Das macht man aber nicht selbst, sondern läßt die Bytes am besten mit einem HTML-Parser parsen, z.B. BeautifulSoup. Das ermittelt dann das richtige Encoding automatisch.
vertretung
User
Beiträge: 20
Registriert: Sonntag 11. August 2019, 09:06

Nur leider, wenn ich all das encoding weglasse, ändert das nichts an der Situation
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was willst Du denn erreichen? Wie schon geschrieben, macht JSON hier so keinen Sinn. Du brauchst also einen HTML-Parser. Und der kann mit dem Encoding umgehen.
vertretung
User
Beiträge: 20
Registriert: Sonntag 11. August 2019, 09:06

Ich würde gerne den Inhalt des Htmlcodes in eine JSON-Datei schreiben.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Schau dir das Beispiel man an:

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup

URL = "https://list-gymnasium.de/vertretungsplan/upload/Vertretungen-Sa.html"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
print(soup) 
Da wird das Encoding direkt mit übernommen.
vertretung
User
Beiträge: 20
Registriert: Sonntag 11. August 2019, 09:06

Super! Das hat funktioniert und macht auch Sinn. Muss ich beim schreiben von JSON etwas beachten?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vertretung: Noch mal die Frage: *Warum* möchtest Du HTML als JSON speichern? Und dann noch nicht einmal in irgendeiner Struktur (und mit anderen Werten) verpackt, sondern einfach als JSON-Zeichenkette‽ Das macht absolut keinen Sinn.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
vertretung
User
Beiträge: 20
Registriert: Sonntag 11. August 2019, 09:06

Weil ich die Daten mit einem anderen Programm benötige, und ja mit der Struktur arbeite ich noch
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

vertretung hat geschrieben: Dienstag 1. Oktober 2019, 15:29 Weil ich die Daten mit einem anderen Programm benötige, und ja mit der Struktur arbeite ich noch
Evtl. würde es sich auch empfehlen, direkt in Python mit BeautifulSoup das HTML auszuwerten?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vertretung: Und das andere Programm erwartet eine einzelne JSON-Zeichenkette mit HTML drin als Wert? Das macht wie gesagt keinen Sinn. Was ist das denn für ein Programm?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

HTML ist ein für sich stehendes Format, das so schon weiter verarbeitet werden kann. Dafür brauchst du kein JSON. Wenn ich raten sollte, würde ich denken, dass die eigentliche Aufgabe ist, Informationen aus der Seite zu extrahieren, in einer Datenstruktur abzulegen und diese dann als JSON zu serialisieren. Die eigentliche Serialisierung nach JSON ist dabei aber eigentlich ein eher trivialer Aspekt, der zum Schluss kommt. Deine Frage hier, wie man HTML in JSON ablegt, ist daher für diese Fragestellung auch eher ablenkend.
vertretung
User
Beiträge: 20
Registriert: Sonntag 11. August 2019, 09:06

Das ganze brauch ich für ein Programm, welches selber nicht diese Abfrage machen soll. Der Inhalt des HTML soll genutzt werden, dass hab ich auch schon fertig. Mein Problem ist nur, das mit der Kodierung. Also will ich die JSON als Schnittstelle benutzen. Habt ihr da eine bessere Idee?
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

vertretung hat geschrieben: Dienstag 1. Oktober 2019, 17:51 Habt ihr da eine bessere Idee?
Curl oder wget benutzen :P JSON hier als "Encoding-Hilfe" zu missbrauchen, ist jedenfalls nicht angemessen. Öffne einfach eine Datei (üblicherweise mit der Endung '.html') im binären Schreibmodus und schreib '.content' dort hinein. Resultat:

Code: Alles auswählen

$ file vertretungsplan.html 
vertretungsplan.html: HTML document, ISO-8859 text, with CRLF line terminators
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du schon ein Programm hast, das das HTML richtig parst, warum kann das dann nicht mit dem Encoding umgehen? Das hört sich alles danach an, als ob Du an anderer Stelle einen Fehler hast, und den jetzt durch komplizierte Umgehungslösungen versuchst zu vertuschen.
Antworten