URLLib2.URL错误:读取服务器响应代码(Python)

URLLib2.URL错误:读取服务器响应代码(Python),python,urllib2,urllib,http-status-codes,Python,Urllib2,Urllib,Http Status Codes,我有一个URL列表。我想查看每个服务器的服务器响应代码,并找出是否有损坏的。我可以读取服务器错误(500)和断开的链接(404),但一旦读取了非网站(例如“notawebsite_break.com”),代码就会断开。我到处找了又找不到答案。。。我希望你能帮忙 代码如下: import urllib2 #List of URLs. The third URL is not a website urls = ["http://www.google.com","http://www.ebay.co

我有一个URL列表。我想查看每个服务器的服务器响应代码,并找出是否有损坏的。我可以读取服务器错误(500)和断开的链接(404),但一旦读取了非网站(例如“notawebsite_break.com”),代码就会断开。我到处找了又找不到答案。。。我希望你能帮忙

代码如下:

import urllib2

#List of URLs. The third URL is not a website
urls = ["http://www.google.com","http://www.ebay.com/broken-link",
"http://notawebsite_broken"]

#Empty list to store the output
response_codes = []

# Run "for" loop: get server response code and save results to response_codes
for url in urls:
    try:
        connection = urllib2.urlopen(url)
        response_codes.append(connection.getcode())
        connection.close()
        print url, ' - ', connection.getcode()
    except urllib2.HTTPError, e:
        response_codes.append(e.getcode())
        print url, ' - ', e.getcode()

print response_codes
这给出了…的输出

http://www.google.com  -  200
http://www.ebay.com/broken-link  -  404
Traceback (most recent call last):
  File "test.py", line 12, in <module>
    connection = urllib2.urlopen(url)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 404, in open
    response = self._open(req, data)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 422, in _open
    '_open', req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1214, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1184, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 8] nodename nor servname provided, or not known>
http://www.google.com  -  200
http://www.ebay.com/broken-link  -  404
回溯(最近一次呼叫最后一次):
文件“test.py”,第12行,在
连接=urlib2.urlopen(url)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,urlopen中的第127行
return\u opener.open(url、数据、超时)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第404行,打开
响应=自身打开(请求,数据)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第422行,打开
"开放",
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第382行,在调用链中
结果=func(*args)
http_open中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第1214行
返回self.do_open(httplib.HTTPConnection,req)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,do_open中的第1184行
引发URL错误(err)
urllib2.URLError:

有人知道这个问题的解决方法吗?或者有人能给我指出正确的方向吗?

当urllib2.urlopen()无法连接到服务器,或者无法解析主机的IP时,它会引发URLError而不是HTTPError。除了urllib2.HTTPError之外,您还需要捕获urllib2.urleror来处理这些情况。

您可以使用以下请求:

import requests

urls = ["http://www.google.com","http://www.ebay.com/broken-link",
"http://notawebsite_broken"]

for u in urls:
    try:
        r = requests.get(u)
        print "{} {}".format(u,r.status_code)
    except Exception,e:
        print "{} {}".format(u,e)

http://www.google.com 200
http://www.ebay.com/broken-link 404
http://notawebsite_broken HTTPConnectionPool(host='notawebsite_broken', port=80): Max retries exceeded with url: /

urllib2库的API是一场噩梦

包括我在内的许多人强烈建议使用
请求
包:

请求
的一个优点是,任何请求问题都继承自一个基本异常类。当您使用
urlib2
“raw”时,除了
socket
模块和其他一些模块(我不记得了,但它很乱)之外,还可以从
urlib2
引发一些异常


tldr——只需使用
请求
库。

很好。请求要容易得多!谢谢。非常好。将代码更改为使用
异常除外作为e
,也将使其在Python3.x.x中工作。