HTML lesen / schreiben, Encoding

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
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hi Zusammen,

simples Programm, ließt eine Webseite aus, extrahiert einige Teile und soll sie in eine lokale HTML Datei schreiben.
Leider stolper ich schon wieder über die Encodings :(

Code: Alles auswählen

# -*- coding: utf-8 -*-
from urllib2 import urlopen
from lxml.html import parse
from lxml.etree import tostring
from lxml.html import HTMLParser
import socket
import re
import urllib
import os
socket.setdefaulttimeout(30)



def readInfos(url):
    content=""
    try:
        response = parse(urlopen(url))
        resp=response.xpath('//div[@class="film-heading"]')
        content=content+tostring(resp[0], encoding="utf-8")
        resp=response.xpath('//ul[@class="rating-list"]')
        content=content+tostring(resp[0], encoding="utf-8")
        resp=response.xpath('//div[@class="description-text"]')
        content=content+tostring(resp[0], encoding="utf-8")
    except Exception,e:
        content=None
    return content

f=open("test.html","w")
f.write('<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body><link rel="stylesheet" type="text/css" href="http://a2.tvspielfilm.de/_css/combined.css.20140819152446.php"/>')
c=readInfos("http://www.tvspielfilm.de/tv-programm/sendung/elegy-oder-die-kunst-zu-lieben,107060705601.html")
f.write( c)
f.write("</body></html>)")
f.close()
Viele Grüße
d
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und was genau ist das Problem? Ich sehe in Deinem Posting weder eine Fehlermeldung, noch eine Beschreibung des tatsächlichen und des erwarteten Verhaltens!

Ein paar grundsätzliche Anmerkungen: Nutze für HTTP-Kommunikation das Requests-Modul. Das ist wesentlich angenehmer als die verschiedenen Libs aus der Standard-Lib.

Strings solltest Du nicht mittels ``+`` zusammenbauen, sondern mittels ``str.join`` und einer Collection (wie z.B. einer Liste) oder bei fixen Ersetzungen mittels ``str.format``-Methode oder dem ``%`` Operator.

Nutze einen Templating Mechanismus für das erzeugte HTML. Das liest sich so ja grausam! Vermutlich genügt der aus der Standard-Lib.

Dateien sollte man immer mit ``with`` öffnen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hi,

dachte das Problem wäre klar :) falsch dargestellte Umlaute. "prätentiösen"
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

parse von lxml versteht auch URLs direkt. Das hat den Vorteil, dass das Encoding, das vom Server übertragen wird, mitberücksichtigt wird.
Welches encoding hat response denn?
Normalerweise arbeitet man intern ausschließlich mit Unicode-Strings. Das Encoding macht man erst beim Schreiben in eine Datei.
Das Exception-Handling von readInfos ist Schrott. Das kannst Du gleich bleiben lassen.
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Sirius3 hat geschrieben:parse von lxml versteht auch URLs direkt. Das hat den Vorteil, dass das Encoding, das vom Server übertragen wird, mitberücksichtigt wird.
Welches encoding hat response denn?
Normalerweise arbeitet man intern ausschließlich mit Unicode-Strings. Das Encoding macht man erst beim Schreiben in eine Datei.
Die Response ist UTF-8. Wie würde ich denn hier mit unicode Strings arbeiten? nach dem Lesen ein Decode (Utf-8) und beim schreiben in die Datei ein encode?
Sirius3 hat geschrieben: Das Exception-Handling von readInfos ist Schrott. Das kannst Du gleich bleiben lassen.
Kommt drauf auf...das ist nur ein Teilstück eines Programmes, ich will sicher stellen dass das Programm sauber durchläuft, auf einen einzelnen Fehler beim Auslesen einer solchen Seite kommt es da nicht an...
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

da.dom hat geschrieben:Die Response ist UTF-8.
Dann passt ja alles, Du liest UTF-8, Du schreibst UTF-8. Wo siehst Du denn ein "prätentiösen"?

Wenn ein Fehler in "readInfo" auftritt, wird None zurückgeliefert, None kann aber nicht geschrieben werden, also fliegt das Programm mit einer unverständlichen Fehlermeldung statt mit einer verständlichen raus.
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Das geht:
http://raj.blog.archive.org/2012/07/19/ ... with-lxml/

Danke und viele Grüße
D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zum Thema Unicode und Encodings guck Dir mal meine Signatur an :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten