Seite 1 von 1

Liste organisieren, wie?

Verfasst: Mittwoch 28. Mai 2008, 16:36
von Crazed
Hallo,
Der Titel ist vielleicht ein bisschen komisch ausgedrückt aber mir fiel nichts Besseres ein:

Code: Alles auswählen

    def get_mail_list(self, mail_account):
        response = unicode(self._browser.open('http://www.temporaryinbox.com/inbox.php', 'inbox=' + mail_account).read(),\
                           self._browser.encoding())

        mail_count = 0

        for mail in range(0, response.count('<tr onclick="')):
            mail_count += 1
Das ist der Code.

"<tr onclick="" indiziert eine vorhandene mail auf der Seite.
Das heißt wenn es 2 gibt wird mail_count nachher natülrich auf 2 stehen.

Warum das alles in einer for schleife und nicht einfach mit?:

mail_count = response.count('<tr onclick="'))

Nun weil ich noch folgendes machen will:
Ich möchte zu jedem mail eintrag den verweisenden link bekommen, den sender der mail und den Titel der Mail.

Jetzt habe ich aber keine Ahnung wie ich das organisieren soll.

Tuple und List fallen weg weil mir nicht einfällt wie ich folgendes machen soll

Code: Alles auswählen

mail_list.add([id=id, author=author, title=title])
Da bleibt dann noch ein dictionary. Aber das müsste ich dann eigentlich kapseln:

Code: Alles auswählen

mail_list = {'title':{'author':author, 'id':id}}
Mir will einfach keine gute Lösung einfallen :|.
Hat jemand eine Idee?

EDIT:
Ich sehe grade das sich BeautifulSoup für diese Zwecke gut eignen könnte, kann mir jemand erklären was es genau mit BeautfilSoup auf sich hat und ob es das beste Modul für solche Vorhaben ist? Wäre toll!

Verfasst: Mittwoch 28. Mai 2008, 17:01
von birkenfeld
Wenn du die Reihenfolge nicht brauchst, ist das geschachtelte Dictionary einwandfrei (bei so wenigen Einträgen könne man "id" und "author" auch als Tupel speichern).

Ansonsten musst du halt Dictionaries/Tupel in eine Liste stecken:

Code: Alles auswählen

mail_list = []
mail_list.append((id, author, title))

# oder

mail_list = []
mail_list.append({'id': id, 'author': author, 'title': title})

Re: Liste organisieren, wie?

Verfasst: Mittwoch 28. Mai 2008, 17:26
von audax

Code: Alles auswählen

        for mail in range(0, response.count('<tr onclick="')):
            mail_count += 1
warum nicht

Code: Alles auswählen

mail_count += response.count('<tr onclick="')
?

Re: Liste organisieren, wie?

Verfasst: Mittwoch 28. Mai 2008, 17:53
von birkenfeld
audax hat geschrieben: warum nicht

Code: Alles auswählen

mail_count += response.count('<tr onclick="')
Hättest du seinen Post mal ganz gelesen...

Re: Liste organisieren, wie?

Verfasst: Mittwoch 28. Mai 2008, 18:44
von Crazed
birkenfeld hat geschrieben:
audax hat geschrieben: warum nicht

Code: Alles auswählen

mail_count += response.count('<tr onclick="')
Hättest du seinen Post mal ganz gelesen...
Ok danke Birkenfeld das hilft schonmal.
Gehört zwar nicht mehr direkt zu der Fragestellung aber es scheint so als kennst du dich einigermaßen mit dem modul "BeautifulSoup" aus.

Ich möchte folgendes filtern:
<tr onclick="location.href='showmail.php?inbox=k3p4cm5tsdz72qv&mail=MTIxMTk5ODY4MTE0NzkxMTk3NDk=';" style="cursor: pointer;" onmouseover="this.style.backgroundColor='#FFCD35'" onmouseout="this.style.backgroundColor=''"><td><a href="showmail.php?inbox=k3p4cm5tsdz72qv&mail=MTIxMTk5ODY4MTE0NzkxMTk3NDk=" target="_self" style="text-decoration: none; font-weight: normal;">crackpod@googlemail.com</a></td><td width="500"><a href="showmail.php?inbox=k3p4cm5tsdz72qv&mail=MTIxMTk5ODY4MTE0NzkxMTk3NDk=" target="_self" style="text-decoration: none; font-weight: normal;">long_string123</a></td><td><a href="inbox.php?inbox=k3p4cm5tsdz72qv&delete=MTIxMTk5ODY4MTE0NzkxMTk3NDk=" target="_self"><img src="img/delete.gif" border="0"></a></td></tr>
Daraus eigentlich nur diesen Teil:
<a href="showmail.php?inbox=k3p4cm5tsdz72qv&mail=MTIxMTk5ODY4MTE0NzkxMTk3NDk="
Nach einem kurzen Blick auf die Soup Doku habe ich folgendes probiert:

soup.FindAll('tr onclick') #-> Keine Ergebnisse
soup.FindAll('tr') #-> Viele aber unwichtige Ergebnisse

jetzt wollte ich wissen ob es eine Möglichkeit gibt das erste Beispiel zu realsieren also 'tr onclick'.

MfG,
CracKPod

Verfasst: Mittwoch 28. Mai 2008, 18:51
von audax
evtl. wäre da lxml.etree mit xpath besser geeignet..

Verfasst: Mittwoch 28. Mai 2008, 20:46
von BlackJack
@Crazed: ``soup.FindAll('tr onclick')`` kann nicht funktionieren, weil es kein Tag mit dem Namen 'tr onclick' gibt, ja nicht einmal bei XML geben könnte, weil Tagnamen keine Leerzeichen enthalten dürfen. Alle Tags mit einem bestimmten Attribut bekommt man so: ``soup(tagname, attr_name=True)``. Also zum Beispiel:

Code: Alles auswählen

for row in soup('tr', onclick=True):
    print row.a['href']

Verfasst: Samstag 31. Mai 2008, 08:17
von Crazed
BlackJack hat geschrieben:@Crazed: ``soup.FindAll('tr onclick')`` kann nicht funktionieren, weil es kein Tag mit dem Namen 'tr onclick' gibt, ja nicht einmal bei XML geben könnte, weil Tagnamen keine Leerzeichen enthalten dürfen. Alle Tags mit einem bestimmten Attribut bekommt man so: ``soup(tagname, attr_name=True)``. Also zum Beispiel:

Code: Alles auswählen

for row in soup('tr', onclick=True):
    print row.a['href']
Hey, super Danke!
Und was mache ich jetzt wenn ich z.b das Schlüsselwort "class" benutzen will? Python wirft immer einen Exception... ist ja auch klar es erwartet eine Klassen Definition aber es gibt ja auf webseiten z.b auch <class span...>

Hast du eine Idee?
Mfg,
CracKPod

Verfasst: Samstag 31. Mai 2008, 08:42
von audax
Im Zweifelsfall `getattr` nehmen :o

Verfasst: Samstag 31. Mai 2008, 09:59
von lunar
Crazed hat geschrieben:
BlackJack hat geschrieben:@Crazed: ``soup.FindAll('tr onclick')`` kann nicht funktionieren, weil es kein Tag mit dem Namen 'tr onclick' gibt, ja nicht einmal bei XML geben könnte, weil Tagnamen keine Leerzeichen enthalten dürfen. Alle Tags mit einem bestimmten Attribut bekommt man so: ``soup(tagname, attr_name=True)``. Also zum Beispiel:

Code: Alles auswählen

for row in soup('tr', onclick=True):
    print row.a['href']
Hey, super Danke!
Und was mache ich jetzt wenn ich z.b das Schlüsselwort "class" benutzen will?
Die Dokumentation lesen.