Seite 1 von 1

Suche elegante Lösung um HTML-Tabelle auszulesen

Verfasst: Donnerstag 21. August 2008, 08:53
von alexander
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.

Verfasst: Donnerstag 21. August 2008, 09:05
von audax
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 :)

Verfasst: Donnerstag 21. August 2008, 09:29
von Leonidas
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 :)

Verfasst: Donnerstag 21. August 2008, 09:57
von 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()

Verfasst: Donnerstag 21. August 2008, 21:25
von alexander
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.