Supplierplan auslesen mit BeautifulSoup

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
mots
User
Beiträge: 9
Registriert: Dienstag 10. Juli 2007, 09:44

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
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)
Antworten