Seite 1 von 1

Kodierung von html zu json

Verfasst: Montag 30. September 2019, 17:55
von vertretung
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?

Re: Kodierung von html zu json

Verfasst: Montag 30. September 2019, 19:15
von nezzcarth
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.

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 08:37
von Sirius3
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.

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 13:22
von vertretung
Nur leider, wenn ich all das encoding weglasse, ändert das nichts an der Situation

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 13:30
von Sirius3
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.

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 14:05
von vertretung
Ich würde gerne den Inhalt des Htmlcodes in eine JSON-Datei schreiben.

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 14:17
von Jankie
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.

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 14:24
von vertretung
Super! Das hat funktioniert und macht auch Sinn. Muss ich beim schreiben von JSON etwas beachten?

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 14:25
von __blackjack__
@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.

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 15:29
von vertretung
Weil ich die Daten mit einem anderen Programm benötige, und ja mit der Struktur arbeite ich noch

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 15:47
von HarteWare
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?

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 16:07
von __blackjack__
@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?

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 16:33
von nezzcarth
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.

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 17:51
von vertretung
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?

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 18:19
von nezzcarth
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

Re: Kodierung von html zu json

Verfasst: Dienstag 1. Oktober 2019, 20:00
von Sirius3
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.