mechanize browser.links() ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Sonntag 25. Mai 2008, 10:39

Hallo,
Nach meiner Aufassung gibt doch die Funktion aus dem mechanize modul

'links()' ein dictionary für jeden gefunden link wieder mit ein paar zusätlichen Informationen: wie z.B text, url etc.

Jetzt probier ich einer Schleife folgendes zu machen:

Code: Alles auswählen

import mechanize
import urllib

class Yahoo(object):
    def __init__(self):
        self._browser = mechanize.Browser()
        self._browser.set_handle_robots(False)
        
    def search(self, query):
        self._browser.open('http://de.search.yahoo.com/search', urllib.urlencode({'p': query}))
        for link in self._browser.links():
            print link['url']
Bekomme aber den folgenden Error:
File "C:\Python25\Projects\Google\Google.py", line 17, in search
print link['url']
AttributeError: Link instance has no attribute '__getitem__'
Hat jemand eine Idee wo dran es liegt?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Sonntag 25. Mai 2008, 10:49

Der Docstring sagt: "Return iterable over links (mechanize.Link objects)". Und `mechanize.Link`-Objekte haben ein ``url``-Attribut.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Sonntag 25. Mai 2008, 10:49

Hi

link.attrs ist eine Liste im Stil von [('attr_name','wert'), ('attr_name2','wert')].
Also musst du dort den Tuple mit den Namen 'href' suchen und den Wert nehmen für die URL.

Text geht über link.text.

Code: Alles auswählen

for name,value in link.attrs:
    if name == 'href':
        print value
print link.text
Gruss
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Sonntag 25. Mai 2008, 11:58

rayo hat geschrieben:Hi

link.attrs ist eine Liste im Stil von [('attr_name','wert'), ('attr_name2','wert')].
Also musst du dort den Tuple mit den Namen 'href' suchen und den Wert nehmen für die URL.

Text geht über link.text.

Code: Alles auswählen

for name,value in link.attrs:
    if name == 'href':
        print value
print link.text
Gruss
Jetzt bin ich ein bisschen verwirrt:

Ich dachte es wäre so:

Liste = ['String1', 123, 'String2] #Veränderbar
Tuple = ('String1', 123, 'String2) #Unveränderbar
Dictionary = {'String1':'String1:, 123:123} #Veränderbar

Was ist das dann für ein Konstrukt?

[('attr_name','wert'), ('attr_name2','wert')]

2 Tuple in einer Liste?

Wenn mir das jemanden erklären könnte, wäre ich sehr dankbar.

MfG,
CracKPod
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 25. Mai 2008, 12:09

Crazed hat geschrieben:Was ist das dann für ein Konstrukt?

[('attr_name','wert'), ('attr_name2','wert')]

2 Tuple in einer Liste?
Ja genau. Ist zum Beispiel nützlich, wenn man ein Mapping mit Reihenfolge haben will. Denn in einem normalen Dict ist die Reihenfolge undefiniert. Also kann man entweder Tupel in Listen packen oder ein geordnetes Dict nehmen (welches aber nicht Teil der Stdlib ist).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Sonntag 25. Mai 2008, 12:26

Dann kann man aber die Tuples doch nur über den Index ansprechen oder?

Also mit Zahlen?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 25. Mai 2008, 13:03

Crazed hat geschrieben:Dann kann man aber die Tuples doch nur über den Index ansprechen oder?
Ja. Oder einfach drüberiterieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Sonntag 25. Mai 2008, 13:49

Danke sehr! Vielen Dank!
Antworten