Seite 1 von 1

HTML-Daten in XML Speichern

Verfasst: Mittwoch 21. Mai 2008, 17:26
von JanDMC
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

Verfasst: Mittwoch 21. Mai 2008, 17:29
von Leonidas
Die Seite scrapen (BeautifulSoup/html5lib) und dann aus den interessanten Einträgen eine XML-Datei bauen (ElementTree/lxml).

Verfasst: Donnerstag 22. Mai 2008, 00:24
von Y0Gi
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.

Verfasst: Donnerstag 22. Mai 2008, 08:45
von 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()