Suche elegante Lösung um HTML-Tabelle auszulesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
alexander
User
Beiträge: 8
Registriert: Donnerstag 21. August 2008, 07:31

Hallo,
seit 2 Monaten programmiere ich in Python und habe mir ein kleines Programm geschrieben, das von einer Seite der Uni den Stundenplan als html-Seite mit mechanize herunterlädt und dann in eine iCalendar-Datei schreibt.
Ein Beispiel für eine HTML-Datei sieht so aus: http://paste.pocoo.org/show/82872/

Momentan lese ich das ganze sehr umständlich zeilenweise aus, suche nach dem String

Code: Alles auswählen

<td nowrap="nowrap">
und verarbeite die folgenden Zeilen mit vielen elif-Bedingungen und Zählern. :( (Musste vor den Prüfungen schnell gehen)

Aus dem Code für einen einzelnen Termin muss ich jeweils die Zeilen 3, 4, 8, 9, 12 und 14 (enthält nur ab und zu Text) auslesen und gruppiert an eine Funktion übergeben, die daraus den iCalendar konformen Termin erstellt:

Code: Alles auswählen

  <tr>
  	<td nowrap="nowrap">
  		Mo, 14.04.2008
  		<p>08:00 - 10:00</p>
  	</td>
  	<td>

  	 7M0608 - Einführung ins Praktikum der Physik für Mediziner II
  	 <p>Gruppe: A</p>
  	</td>
  	<td>
  	Hörsaal LMU-Audimax<br />Hauptgebäude der LMU<br />Geschwister-Scholl-Platz 1<br />80539 München</td>
  	<td>
  	
  	</td>

	</tr> 	
   
  <tr>
Hat jemand eine gute Idee, wie man das möglichst einfach umsetzen kann? Leider habe ich nirgends gute Beispiele für die Benutzung von Parser-Modulen in Tabellen mit so einer Struktur gefunden.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

http://codespeak.net/lxml/

Hat auch ein HTML Modul.

Noch als Suchwort: Was du machen willst, nennt man "scraping" und beim "python srape tables" findet google einiges :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo alexander, willkommen im Forum,

Ja, lxml ist wohl eine gute Wahl, man kann auch noch html5lib davorschalten, wenn man mag.

Ich persönlich würde dann direkt iCalendar generieren lassen.

P.S.: Wir haben heute wieder ein Usertreffen in der LMU, vielleicht magst du ja vorbeischauen. Letzten Monat wurde dort auch lxml vorgestellt :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Oder man nimmt den "Klassiker" `BeautifulSoup`. Beispiel:

Code: Alles auswählen

from BeautifulSoup import BeautifulSoup


def extract_texts(node):
    return [s.strip() for s in node(text=True)]


def main():
    source_file = open('test.html')
    soup = BeautifulSoup(source_file)
    source_file.close()
    
    for row in soup.find('table', 'results')('tr')[1:]:
        time_cell, course_cell, location_cell = row('td')[:3]
        tmp = extract_texts(time_cell)
        time = '%s, %s' % (tmp[0], tmp[1])
        
        course, group = extract_texts(course_cell)[:2]
        
        location = '\n'.join(extract_texts(location_cell))
        
        print '-' * 60
        print '    time:', time
        print '  course:', course
        print '   group:', group
        print 'location:'
        print location


if __name__ == '__main__':
    main()
alexander
User
Beiträge: 8
Registriert: Donnerstag 21. August 2008, 07:31

Vielen Dank für den freundlichen Empfang im Forum und die Anregungen, ich werde die verschiedenen Möglichkeiten in den nächsten Tagen mal ausprobieren.

@audax: Wenn man weiß, wonach man suchen muss ist es ja auch einfach, danke für den Hinweis :)

@Leonidas: Danke für den Tipp mit dem Usertreffen, war wirklich interessant mal die Möglichkeiten der "richtigen" Text-Editoren kennen zu lernen.
Antworten