在Python 3(urllib)中打印HTTP状态代码

arj*_*916 0 python windows urllib visual-studio python-3.x

我正在尝试获取包括3XX在内的http状态代码,但是无法从我的代码中打印出来。

这是代码:

import urllib
import urllib.request
import urllib.error

urls = ['http://hotdot.pro/en/404/', 'http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org', 'http://www.voidspace.org.uk']
fh = open("example.txt", "a")
def getUrl(urls):
   for url in urls:
        try:
           with urllib.request.urlopen(url) as response:
                requrl = url
                the_page = response.code
                fh.write("%d, %s\n" % (int(the_page), str(requrl)))
        except (urllib.error.HTTPError, urllib.error.URLError)  as e:
            requrl = url
            print (e.code)
            fh.write("%d, %s\n" % (int(e.code), str(requrl)))
getUrl(urls)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我弄这个吗?

Mos*_*oye 5

并非所有的类错误URLError都会有一个code,一些错误只会有一个reason

此外,在同一块中捕获 URLError和并不是一个好主意(请参阅docs):HTTPErrorexcept

def getUrl(urls):
   for url in urls:
        try:
           with urllib.request.urlopen(url) as response:
                log(fh, response.code, url)
        except urllib.error.HTTPError  as e:
            log(fh, e.code, url)
        except urllib.error.URLError as e:
            if hasattr(e, 'reason'):
                log(fh, e.reason, url)
            elif hasattr(e, 'code'):
                log(fh, e.code, url)

 def log(fh, item, url):
     print(item)
     fh.write("%s, %s\n" % (item, url))
Run Code Online (Sandbox Code Playgroud)


小智 5

在您的代码中实例化以下内容。

   try:
        response = urllib.request.urlopen(url)
        code = response.getcode()
        print(code)

    except Exception as e:
        print(f'Error:  {url} : {str(e)}')
Run Code Online (Sandbox Code Playgroud)