Seite 1 von 1

HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 11:59
von da.dom
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

Re: HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 12:06
von Hyperion
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.

Re: HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 12:28
von da.dom
Hi,

dachte das Problem wäre klar :) falsch dargestellte Umlaute. "prätentiösen"

Re: HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 12:41
von Sirius3
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.

Re: HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 13:38
von da.dom
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...

Re: HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 13:59
von Sirius3
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.

Re: HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 14:37
von da.dom
Das geht:
http://raj.blog.archive.org/2012/07/19/ ... with-lxml/

Danke und viele Grüße
D

Re: HTML lesen / schreiben, Encoding

Verfasst: Sonntag 7. September 2014, 15:30
von Hyperion
Zum Thema Unicode und Encodings guck Dir mal meine Signatur an :-)