ich habe ein Skript geschrieben, mit dem ich EPG-Daten aus meinem DVB-Receiver (Enigma2) auslese und in eine MySQL-Datenbank schreibe. Ist noch nicht ganz fertig, funktioniert aber so weit schon ganz gut. Das Prinzip: Über das Webinterface des Receivers werden die EPG-Webseiten der jeweiligen Sender eingelesen und dann in einzelne Einträge zerlegt. Aus Performance-Gründen werde ich die heruntergeladenen HTML-Seiten aber noch als Files lokal ablegen und dann erst parsen. Habe ich schon ausprobiert - dauert nur halb so lange.
Jetzt aber zu meinem Thema, zum ABER ...
Überall dort, wo im Ausgangsmaterial, der HTML-Seite also, ein <br> für einen Zeilenumbruch steht, taucht in meiner Datenbank ein Š auf (großes S mit umgekehrtem Zirkonflex). Ich habe mir die Liste epg einfach mal auf der Konsole ausgeben lassen, dort steht anstelle des <br> ein UTF-8-Code: \xc2\x8a.
Kann mir mal bitte jemand aufs Pferd helfen?
Hier der Code:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf8 -*-
import MySQLdb
from contextlib import closing
import re
import urllib
import login
EVENT_END = '</e2event>'
TIME_START = '<e2eventstart>'
TIME_END = '</e2eventstart>'
DURATION_START = '<e2eventduration>'
DURATION_END = '</e2eventduration>'
TITLE_START = '<e2eventtitle>'
TITLE_END = '</e2eventtitle>'
DESCRIPTION_START = '<e2eventdescription>'
DESCRIPTION_END = '</e2eventdescription>'
LONG_DESCRIPTION_START = '<e2eventdescriptionextended>'
LONG_DESCRIPTION_END = '</e2eventdescriptionextended>'
def get_events(lines):
i = 0
item = ""
events = []
while i < len(lines):
item = item + lines[i]
if EVENT_END in lines[i]:
events.append(item)
item = ""
i += 1
return events
def parse_event(event):
data = []
data.append(re.search(
TITLE_START+'(.*?)'+TITLE_END, event).group(1))
data.append(re.search(
DESCRIPTION_START+'(.*?)'+DESCRIPTION_END, event).group(1))
data.append(re.search(
LONG_DESCRIPTION_START+'(.*?)'+LONG_DESCRIPTION_END, event).group(1))
data.append(re.search(
TIME_START+'(.*?)'+TIME_END, event).group(1))
data.append(re.search(
DURATION_START+'(.*?)'+DURATION_END, event).group(1))
return data
def add_events_to_db(connection, cursor, alias, events):
i = 0
while i < len(events):
data = parse_event(events[i])
title = data[0].decode('utf-8')
description = data[1].decode('utf-8')
long_description = data[2].decode('utf-8')
time = data[3]
duration = data[4]
cursor.execute('INSERT INTO epg \
(alias, title, description, long_description, time, duration) \
VALUES (%s,%s,%s,%s,%s,%s)',
(alias, title, description,
long_description, time, duration))
i += 1
connection.commit()
def main():
with closing(MySQLdb.connect(
login.DB_HOST, login.DB_USER,
login.DB_PASSWORD, login.DB_DATABASE)) as connection:
with closing(connection.cursor()) as cursor:
cursor.execute('TRUNCATE TABLE epg')
connection.commit()
cursor.execute('SELECT alias, url FROM lamedb')
result = cursor.fetchall()
for db_record in result:
alias = db_record[0]
url = db_record[1]
f = urllib.urlopen(url)
epg = f.readlines()
events = get_events(epg)
add_events_to_db(connection, cursor, alias, events)
if __name__ == '__main__':
main()
Alternativ habe ich dies hier ausgetestet (zwischenspeichern und dann erst parsen, s.o.). Hatte aber denselben Effekt:
Code: Alles auswählen
# ...
for db_record in result:
alias = db_record[0]
url = db_record[1]
local_file = '/home/pi/radiobeere/epg/' + alias + '.epg'
urllib.urlretrieve(url, local_file)
for db_record in result:
alias = db_record[0]
local_file = '/home/pi/radiobeere/epg/' + alias + '.epg'
f = open(local_file, 'r')
epg = f.readlines()