Seite 1 von 1

Supplierplan auslesen mit BeautifulSoup

Verfasst: Mittwoch 12. September 2007, 20:34
von mots
Hi, ich versuche, den Supplierplan unserer Schule auszulesen und in ein benutzbares Format zu bekommen (Will ne kleine GUI dazu basteln). Ist aber mein erster versuch mit BeautifulSoup und ich bin ziemlich mies darin, könnte mir eventuell jemand helfen? :D das hab ich bis jetzt, ist mies und kriegt bis jz nur die Tage... (Ja, ich weiß, das der login im script sichtbar ist, macht nix, weil der sowieso auf der HP unsrer schule steht ;D)

Code: Alles auswählen

import urllib
from BeautifulSoup import BeautifulSoup

test=urllib.urlopen('http://admin.supplierplan.at/cgi-bin/supp.pl', 'find=7bi&id=101016&user=schueler&pwd=dsdns').read()
soup=BeautifulSoup(test)
contentsoup =BeautifulSoup(str(soup.findAll('table',{ 'class' : 'ListBox' })))
uselessinfo=contentsoup.findAll('tr',{ 'bgcolor' : '#FFFF80' })
[crap.extract() for crap in uselessinfo]
dates=contentsoup.findAll('b')
print dates

Verfasst: Mittwoch 12. September 2007, 22:24
von BlackJack
Das ist ja ein netter Mix aus deutsch und englisch auf der Seite. :shock:

Dieser Umweg aus einem `BeautifulSoup`-Objekt über eine Zeichenkette wieder ein solches Objekt zu erzeugen ist unnötig. Die Objekte die man durch Abfragen bekommt haben selbst wieder alle nötigen Methoden.

Und `extract()` sollte man auch nicht benutzen wenn man es nicht wirklich braucht. Eine "list comprehension" als ``for``-Schleife für einen Seiteneffekt zu missbrauchen ist übrigens schlechter Stil.

Ist das hier ungefähr was Du brauchst?

Code: Alles auswählen

import urllib
from pprint import pprint
from BeautifulSoup import BeautifulSoup


def main():
    def get_td_texts(table_row):
        return [''.join(td(text=True)) for td in table_row('td')]
    
    website = urllib.urlopen('http://admin.supplierplan.at/cgi-bin/supp.pl',
                             'find=7bi&id=101016&user=schueler&pwd=dsdns')
    source = website.read()
    website.close()
    
    soup = BeautifulSoup(source, convertEntities=BeautifulSoup.HTML_ENTITIES)
    first_tr = soup.find('table', 'ListBox').tr
    if 'DATUM' not in first_tr.td(text=True):
        raise ValueError()
    header = get_td_texts(first_tr)
    content = map(get_td_texts, first_tr.findNextSiblings('tr'))
    print header
    pprint(content)