httplib und urls mit : im namen

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
Powlus
User
Beiträge: 4
Registriert: Mittwoch 27. Mai 2009, 20:18

Hallo erstema,
ich trau mich derzeit an die httplib von python (2.6.2, 3.0.1 auch möglich) heran und hab versucht eine verbindung zu wikipedia herzustellen und die redirect seite "Spezial:Zufällige_Seite" aufzurufen:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import httplib
connection = httplib.HTTPConnection("de.wikipedia.org/wiki")
connection.request("GET", "/Spezial:Zufällige_Seite")
response = connection.getresponse()
print response.status, response.reason
data1 = response.read()
print data1
wenn ich nun anstatt wiki einen anderen host angebe, z.b www.google.de, und die /index.html anfordere läufts alles einwandfrei.

wenn ich die fehlermeldungen richtig gedeutet habe, liegts wohl am : in "Spezial:Zufälli...", da dann alles danach als port aufgefasst wird.

gibt es da möglichkeiten trotzdem die seite aufzurufen und zu empfangen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du musst den ":" bestimmt escapen (wo wie viele andere zeichen auch, etwa Leerzeichen "&" usw.)

Probiers mal mit "%3A".

Guck Dir dazu mal die utility functions in der urllib an.
Powlus
User
Beiträge: 4
Registriert: Mittwoch 27. Mai 2009, 20:18

danke für die schnelle antwort, hab jetzt folgendes draus gemacht:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import httplib
import urllib
zufall = "/Spezial:Zufällige_Seite"
zufall = urllib.quote(zufall)
#print zufall
conn = httplib.HTTPConnection("de.wikipedia.org/wiki")
conn.request("GET", zufall)
r1 = conn.getresponse()
print r1.status, r1.reason
data1 = r1.read()
print data1
per quote erhalte ich dann auch "/Spezial%3AZuf%E4llige_Seite", bekomm aber immer noch die selben fehler.

fehlerlog:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/powl/workspace/downloader/src/downloader.py", line 10, in <module>
    conn.request("GET", zufall)
  File "/usr/lib/python2.5/httplib.py", line 866, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.5/httplib.py", line 889, in _send_request
    self.endheaders()
  File "/usr/lib/python2.5/httplib.py", line 860, in endheaders
    self._send_output()
  File "/usr/lib/python2.5/httplib.py", line 732, in _send_output
    self.send(msg)
  File "/usr/lib/python2.5/httplib.py", line 699, in send
    self.connect()
  File "/usr/lib/python2.5/httplib.py", line 667, in connect
    socket.SOCK_STREAM):
socket.gaierror: (-2, 'Name or service not known')
das sollten port fehler sein, ich weiß es ehrlich gesagt aber nicht
:oops:

Ich benutze übrigens eclipse mit pydev, was anscheinend auf python 2.5 zurückgreift, intsalliert ist aber 2.6.2, vielleicht liegts auch daran...
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Du möchtest dir noch einmal die Dokumentation zur [mod]httplib[/mod] durchlesen. "de.wikipedia.org/wiki" ist nun einmal kein gültiger Hostname, das "/wiki" gehört eben zum Pfad, der mit der `request`-Methode übermittelt wird. Und gibt es einen Grund, warum gerade httplib benutzt wird und nicht urllib(2)?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Powlus
User
Beiträge: 4
Registriert: Mittwoch 27. Mai 2009, 20:18

ist httplib nich der beste anlauf für sowas?

ich will letztendlich nur zufällige wiki seiten empfangen und dann weiter verwerten und bin davon ausgegangen das über http zu machen.

sollte ich da falsch rangehen, bitte ich darum darauf hingewiesen zu werden, ich lerne halt noch viel was python angeht.

(danke für die schnellen antworten :) )
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

urllib.urlopen(deine_url)
Auslesen der Daten auch hier mit `read()`.

[mod]urllib[/mod]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Noch nen Tipp: In der Doku zu urllib2 findet sich ganz unten auf der Seite ein Snippet. Mit dem klappt's sofort :-)
scrippi
User
Beiträge: 31
Registriert: Montag 6. April 2009, 10:37

probier mal die funktion

Code: Alles auswählen

data = urllib.urlencode(values)
Powlus
User
Beiträge: 4
Registriert: Mittwoch 27. Mai 2009, 20:18

okay klasse funktioniert, auch wenn ich nen forbidden error kriege, aber das liegt wohl kaum am python skript selbst.

danke an alle :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Powlus hat geschrieben:okay klasse funktioniert, auch wenn ich nen forbidden error kriege, aber das liegt wohl kaum am python skript selbst.
Darum habe ich ja auch auf das Beispiel ganz unten verwiesen, bei dem gezeigt wird, wie man den User-Agent header einstellen kann! Damit klappt es dann - zumindest bei mir ;-)
Antworten