Plötzlich HTTP Error 400: Bad Request

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
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

Hallo Leute,

ich hätte da mal wieder einen Fehler.

Ich befasse mich momentan mit der urllib2, welche ich in verbindung mit BS zum parsen von HTML-Dokumenten benutze.
Bis jetzt hat alles ganz gut geklappt und ich habe tonnen von Dokumente geparst. Jetzt habe ich eine andere Quelle (anderer Link auf gleichen Webserver) angepasst und nach der dritten Seite bekomme ich einen Fehler aus der urllib2:

Code: Alles auswählen

    self.html = urllib2.urlopen(req).read()
  File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
Den Vorgang rufe ich folgendermassen auf:

Code: Alles auswählen

headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request(url, None, headers)
self.html = urllib2.urlopen(req).read()
Die Variable 'url' befülle ich natürlich vorher mit entsprechendem Link welcher auch vorhanden ist (lasse diesen auch vorher bei Bedarf ausgeben, kopiere ihn und kontrolliere es im Browser nach -> wie alle anderen Links auch. Vorhanden & funktioniert).

Was könnte hier falsch laufen?
Ich bedanke mich schon einmal im Voraus für eure Hilfe!
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

@kaineanung: da kann man allgemein nichts sagen. Du mußt halt genau schauen, was ein Browser anderes macht als Du,
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

@Sirius3

Kann man wenigstens eine Vermutung äussern bezüglich des Bad Request: 400?
Oder fragen wir mal so:
könnte es am falschen Heder liegen? Oder falsche Whitespaces weil meine Links haben Leerstellen die dann vielleicht falsch aufgelöst werden? Das hatten jedoch auch andere Links auf der gleichen Seite und die haben funktioniert... dennoch, irgendein anhaltspunkt den ich dann verfolgen könne bezüglich des Fehlers?
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

@kaineanung: kein Wunder dass Du ein 400 bekommst. Leerzeichen sind in URLs nicht erlaubt.
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

Ich habe eine Liste mit URLs die abgearbeitet werden sollen.
Jede hat ein Leerzeichen und ich dachte, nachdem es die ersten mal gut funktioniert hat, das urllib2 diese automatisch 'anhandelt'.
Dem scheint dann doch nicht so zu sein obwohl es ja erstmal funktioniert hatte.

Ich habe schon Tonnen an anderen urls 'abgearbeitet'. Diese haben aber grundsätzlich kein Leerzeichen (wollte ich aber nur mal erwähnen).

So, wie behandle ich die URLs um sie ins richtige Format zu bekommen? (Ich frage mal wenn ich schoneinmal hier bin)?

Ok, ich habe es gefunden,

Code: Alles auswählen

quoted_url = urllib2.quote(url, safe=":/")
und dann den Request mit der 'quoted_url' vollziehen....

Will das mal erwähnen falls jemand anderes die gleichen Fehler hat..

@sirus3
Danke dir für den Hinweis!
BlackJack

@kaineanung: Ich würde ja eher `requests` verwenden statt mit `urllib`/`urllib2` & Co alles von Hand selber zu machen.
kaineanung
User
Beiträge: 145
Registriert: Sonntag 5. April 2015, 20:57

@BlackJack

Das war mein Code:

Code: Alles auswählen

            headers = { 'User-Agent' : 'Mozilla/5.0' }
            req = urllib2.Request(url, None, headers)
            self.html = urllib2.urlopen(req).read()
Meinst du damit das urllib2.Request(..) ?
Das hat mir ja den Bad Request eingebracht.
Nachdem ich die url nun 'quote' kommt der Fehler nicht mehr.
Wie gesagt, bei den ersten 2-3 URLs habe ich auch keinen Fehler bekommen obwohl diese ja auch Leerzeichen beinhalteten.
BlackJack

@kaineanung: Nein ich meine das `requests`-Package: http://python-requests.org/
Antworten