Python urllib.urlopen () chiamata non funziona con un URL che un browser accetta
Domanda
Se io punto a Firefox http://bitbucket.org/tortoisehg/stable/ wiki / home / ReleaseNotes , ottengo una pagina di HTML. Ma se provo questo in Python:
import urllib site = 'http://bitbucket.org/tortoisehg/stable/wiki/Home/ReleaseNotes' req = urllib.urlopen(site) text = req.read()
ottengo il seguente:
500 Internal Server Error Il server ha rilevato un errore interno o una configurazione errata e non è riuscito a completare la richiesta.
Che cosa sto facendo di sbagliato?
Soluzione
Non state facendo nulla di male, bitbucket fa alcune rilevamento user agent (per rilevare i clienti mercuriali per esempio). Basta cambiando l'user agent fissa (se non ha urllib
come una stringa).
Si dovrebbe compilare un problema per quanto riguarda questo: http://bitbucket.org/jespern/ bitbucket / temi / new /
Altri suggerimenti
Si sta facendo nulla di male, in superficie, e come la pagina di errore dice che si dovrebbe contattare gli amministratori del sito, perché sono quelli con i log del server che possono spiegare quello che sta succedendo. Per fortuna, gli amministratori del sito di bitbucket sono un gruppo amichevole!
Non c'è dubbio che v'è una certa intestazione o una combinazione di intestazioni che i browser impostati in un modo, urllib imposta in un altro modo, e un bug nel server ottiene solleticato in quest'ultimo caso. Si consiglia di vedere esattamente ciò che le intestazioni vengono inviati ad esempio con Firebug in Firefox, e si riproducono quelli fino a isolare esattamente il bug del server; molto probabilmente sarà l'user agent o qualche "accettare" intestazione -ish che sta solleticando quel bug.
Non credo che stai facendo qualcosa di sbagliato - sembra che questo server era in fondo? Lo script ha funzionato bene per me ( 'testo' conteneva gli stessi dati che visualizzato nel browser).