HTML-Daten in XML Speichern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Hallo Leute,

Wie ist es am einfachsten aus einer HTML Datei, strukturierte Bestandteile auszulesen und in eine XML Datei zu speichern?

Beispiel http://www.werder.de/wettbewerbe/bundes ... esliga.php

Wenn man sich die Tabelle anguckt, könnte man die Daten "Spieltag, Gegner... etc., in ein XML format bringen, nur WIE.

Bitte fragt nicht nach dem Sinn, es soll lediglich eine Übung sein, um später wie z.B. in einer Prüfung ;) darauf vorbereitet zu sein mit XML und insbesondere mit sowas klar zu kommen.


Ich bedanke mich schon einmal...

mfg Jan
joa nää python is toll :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die Seite scrapen (BeautifulSoup/html5lib) und dann aus den interessanten Einträgen eine XML-Datei bauen (ElementTree/lxml).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Je nach Inhalten ist es oft sinnvoll, diese passend als (eigenes) XML abzubilden. Es ist aber auch möglich, XHTML direkt - mit einem entsprechenden Namespace - in XML einzubetten, wie es z.B. Jabber für formatierte Textnachrichten macht. Ein anderes Beispiel ist die Integration von MathML- oder SVG- Dokumenten in ein XHTML-Dokument.
BlackJack

Kleines Beispielprogramm für die angegebene Seite:

Code: Alles auswählen

from __future__ import division, with_statement
from functools import partial
from xml.etree import ElementTree as etree
from BeautifulSoup import BeautifulSoup

def process_day_cell(cell, year):
    day_nr, date, time = cell(text=True)
    date = date.split()[1].split('.')
    time = (time.split()[0].split('.') + ['00'])[:2]
    return (int(day_nr.split('.')[0]),
            '%d-%s-%sT%s:%s' % (year, date[1], date[0], time[0], time[1]))

def process_row(year, row):
    day_cell, opponents_cell, result_cell = row('td', recursive=False)[:3]
    day_nr, date = process_day_cell(day_cell, year)
    team_1, team_2 = (t.strip()
                      for t in opponents_cell(text=True)[0].split('-'))
    result_1, result_2 = result_cell(text=True)[0].split(':')
    return (day_nr, date, team_1, team_2, result_1, result_2)

def process_source(source, year):
    soup = BeautifulSoup(source)
    season_games_table = soup.find('div', 'content_text').table
    return map(partial(process_row, year),
               season_games_table('tr', recursive=False))

def build_xml(rows, year):
    builder = etree.TreeBuilder()
    builder.start('season', dict(year=str(year)))
    for day_nr, date, team_1, team_2, result_1, result_2 in rows:
        builder.start('game', dict(day_nr=str(day_nr),
                                   date=date,
                                   result_1=result_1,
                                   result_2=result_2))
        for team in (team_1, team_2):
            builder.start('team', dict())
            builder.data(team)
            builder.end('team')
        builder.end('game')
    builder.end('season')
    return etree.tostring(builder.close())

def main():
    year = 2008
    with open('test.html') as in_file:
        source = in_file.read()
    print build_xml(process_source(source, year), year)

if __name__ == '__main__':
    main()
Antworten