Ha! Der Hinweis, dass es doch eher sinnvoll ist, ein Zeichen VOR dem Schreiben in die Datenbank zu ersetzen, war der entscheidende.
Zwei Dinge musste ich noch ändern, damit das Script fehlerfrei durchläuft:
1)
replace(u'\x8a', u'\n')
statt
replace(u'\xBA', u'\n')
2)
Sofern summary oder teaser leer ist, was passieren kann, kriege ich einen Fehler mein Einfügen in die Datenbank. Logisch. Man kann nichts einfügen, wo nichts ist. Also muss ich diese beiden Fälle abfangen.
Dann noch im PHP-Script dies
Und fertig!
Wo ist hier der "Gelöst"-Button? Jetzt hoffe ich nur noch, dass \n ordentlich umgesetzt wird, wenn ich summary als ID3-Tag in eine MP3-Datei schreibe. Mal sehen.
Vielen, vielen Dank für eure Geduld. Dein Code ist enorm kompakt und elegant, @Sirius. namedtuple kannte ich noch nicht. In meiner Spaghetti-Schreibweise sieht die Lösung jetzt so aus:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf8 -*-
import MySQLdb
from contextlib import closing
import urllib
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
import login
TIME = 'e2eventstart'
DURATION = 'e2eventduration'
TITLE = 'e2eventtitle'
TEASER = 'e2eventdescription'
SUMMARY = 'e2eventdescriptionextended'
def retrieve_epg(connection, cursor, db_result):
epg = []
for db_record in db_result:
alias = db_record[0]
url = db_record[1]
f = urllib.urlopen(url)
epg.append(f.read())
return epg
def parse_epg(epg):
time = []
duration = []
title = []
teaser = []
summary = []
root = ET.fromstring(epg)
for element in root.iter(TIME):
time.append(element.text)
for element in root.iter(DURATION):
duration.append(element.text)
for element in root.iter(TITLE):
title.append(element.text)
for element in root.iter(TEASER):
teaser.append(element.text)
for element in root.iter(SUMMARY):
summary.append(element.text)
return time, duration, title, teaser, summary
def add_to_db(connection, cursor,
alias, time, duration, title, teaser, summary):
i = 0
while i < len(time):
if not teaser[i]:
teaser[i] = ''
if not summary[i]:
summary[i] = ''
summary[i] = summary[i].replace(u'\x8a', u'\n')
cursor.execute('INSERT INTO epg \
(alias, title, teaser, summary, time, duration) \
VALUES (%s,%s,%s,%s,%s,%s)',
(alias, title[i], teaser[i],
summary[i], time[i], duration[i]))
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')
db_result = cursor.fetchall()
epg = retrieve_epg(connection, cursor, db_result)
i = 0
for db_record in db_result:
alias = db_record[0]
time, duration, title, teaser, summary = parse_epg(epg[i])
add_to_db(connection, cursor,
alias, time, duration, title, teaser, summary)
i += 1
if __name__ == '__main__':
main()