Seite 1 von 1

mechanize browser.links() ?

Verfasst: Sonntag 25. Mai 2008, 10:39
von Crazed
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?

Verfasst: Sonntag 25. Mai 2008, 10:49
von Trundle
Der Docstring sagt: "Return iterable over links (mechanize.Link objects)". Und `mechanize.Link`-Objekte haben ein ``url``-Attribut.

Verfasst: Sonntag 25. Mai 2008, 10:49
von rayo
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

Verfasst: Sonntag 25. Mai 2008, 11:58
von Crazed
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

Verfasst: Sonntag 25. Mai 2008, 12:09
von Leonidas
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).

Verfasst: Sonntag 25. Mai 2008, 12:26
von Crazed
Dann kann man aber die Tuples doch nur über den Index ansprechen oder?

Also mit Zahlen?

Verfasst: Sonntag 25. Mai 2008, 13:03
von Leonidas
Crazed hat geschrieben:Dann kann man aber die Tuples doch nur über den Index ansprechen oder?
Ja. Oder einfach drüberiterieren.

Verfasst: Sonntag 25. Mai 2008, 13:49
von Crazed
Danke sehr! Vielen Dank!