2012-09-06 11 views
8

Nie mogę otworzyć jednego konkretnego adresu URL za pomocą urllib2. To samo podejście sprawdza się w przypadku innych witryn, takich jak "http://www.google.com", ale nie w tej witrynie (która również wyświetla się poprawnie w przeglądarce).urllib2 zwraca 404 stronę, która wyświetla się dobrze w przeglądarkach.

mój prosty kod:

from BeautifulSoup import BeautifulSoup 
import urllib2 

url="http://www.experts.scival.com/einstein/" 
response=urllib2.urlopen(url) 
html=response.read() 
soup=BeautifulSoup(html) 
print soup 

Czy ktoś może mi pomóc, aby to działało?

to mam błąd:

Traceback (most recent call last): 
    File "/Users/jontaotao/Documents/workspace/MedicalSchoolInfo/src/AlbertEinsteinCollegeOfMedicine_SciValExperts/getlink.py", line 12, in <module> 
    response=urllib2.urlopen(url); 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open 
    response = meth(req, response) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 432, in error 
    result = self._call_chain(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain 
    result = func(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 619, in http_error_302 
    return self.parent.open(new, timeout=req.timeout) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open 
    response = meth(req, response) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error 
    return self._call_chain(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain 
    result = func(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 404: Not Found 

Dziękuję

+1

Jaki jest błąd dostać? –

+3

Przerwij wstawianie średników na końcu linii. To jest Python. – FogleBird

+0

Moja wina polegała na uzyskiwaniu parametrów, ale myślę, że to nie jest Twój problem. –

Odpowiedz

8

Właśnie próbowałem i otrzymał kod 404 i tylną stronę.

Zgaduje, że wykonuje wykrywanie użytkownika-agenta, które przypadkowo lub celowo nie udostępnia zawartości pythonowi urllib.

Wyjaśnienie, z urllib, otrzymałem urlopen zwrócony obiekt odpowiedzi z kodem 404 i treścią HTML. Z urllib2.urlopen został zgłoszony wyjątek urllib2.HTTPError.

Proponuję spróbować ustawić agenta użytkownika na coś, co wygląda jak przeglądarka. Tutaj jest pytanie: Changing user agent on urllib2.urlopen

+0

To też było moje przypuszczenie, pobiłeś mnie. – FogleBird

0

hm ... czy jesteś pewien, że adres URL jest prawidłowy? spróbuj "http://www.google.com" Miałem podobny kod i nie ma problemów z urllib. Możesz też użyć instrukcji try-except, aby zobaczyć szczegóły błędu. I oczywiście odpowiedź Matth jest bardzo podobna do prawdy :)

3

Można wykorzystać try except uchwycić błąd

try: 
    u = urllib2.urlopen(req) 
except urllib2.HTTPError, e: 
    print e.code 
    print e.msg 
    return