Liste organisieren, wie?

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
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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})
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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="')
?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

audax hat geschrieben: warum nicht

Code: Alles auswählen

mail_count += response.count('<tr onclick="')
Hättest du seinen Post mal ganz gelesen...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

evtl. wäre da lxml.etree mit xpath besser geeignet..
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']
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Im Zweifelsfall `getattr` nehmen :o
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.
Antworten