Seite 1 von 1

httplib und urls mit : im namen

Verfasst: Mittwoch 27. Mai 2009, 20:28
von Powlus
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?

Verfasst: Mittwoch 27. Mai 2009, 20:34
von Hyperion
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.

Verfasst: Mittwoch 27. Mai 2009, 20:56
von Powlus
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...

Verfasst: Mittwoch 27. Mai 2009, 21:09
von Trundle
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)?

Verfasst: Mittwoch 27. Mai 2009, 21:31
von Powlus
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 :) )

Verfasst: Mittwoch 27. Mai 2009, 22:10
von snafu

Code: Alles auswählen

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

[mod]urllib[/mod]

Verfasst: Mittwoch 27. Mai 2009, 22:19
von Hyperion
Noch nen Tipp: In der Doku zu urllib2 findet sich ganz unten auf der Seite ein Snippet. Mit dem klappt's sofort :-)

Verfasst: Mittwoch 27. Mai 2009, 22:45
von scrippi
probier mal die funktion

Code: Alles auswählen

data = urllib.urlencode(values)

Verfasst: Mittwoch 27. Mai 2009, 23:01
von Powlus
okay klasse funktioniert, auch wenn ich nen forbidden error kriege, aber das liegt wohl kaum am python skript selbst.

danke an alle :D

Verfasst: Donnerstag 28. Mai 2009, 08:38
von Hyperion
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 ;-)