urllib无法读取https

Gre*_*n23 7 https urllib python-3.x

(Python 3.4.2)有人能帮我用urllib获取https页面吗?我花了好几个小时试图解决这个问题.

这是我正在尝试做的事情(非常基本):

import urllib.request
url = "".join((baseurl, other_string, midurl, query))
response = urllib.request.urlopen(url)
html = response.read()
Run Code Online (Sandbox Code Playgroud)

这是我运行它时的错误输出:

File "./script.py", line 124, in <module>
    response = urllib.request.urlopen(url)
  File "/usr/lib/python3.4/urllib/request.py", line 153, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.4/urllib/request.py", line 455, in open
    response = self._open(req, data)
  File "/usr/lib/python3.4/urllib/request.py", line 478, in _open
    'unknown_open', req)
  File "/usr/lib/python3.4/urllib/request.py", line 433, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 1244, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib.error.URLError: <urlopen error unknown url type: 'https>
Run Code Online (Sandbox Code Playgroud)

我也试过使用data = None无济于事:

response = urllib.request.urlopen(url, data=None)
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

import urllib.request, ssl
https_sslv3_handler = urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_SSLv3))
opener = urllib.request.build_opener(https_sslv3_handler)
urllib.request.install_opener(opener)
resp = opener.open(url)
html = resp.read().decode('utf-8')
print(html)
Run Code Online (Sandbox Code Playgroud)

此^脚本发生类似的错误,其中错误发生在"resp = ..."行,并抱怨'https'是未知的url类型.

Python是在我的计算机(Arch Linux)上使用SSL支持编译的.我已经尝试过几次重新安装python3和openssl,但这没有用.我没有尝试完全卸载python然后重新安装,因为我还需要在我的计算机上卸载很多其他程序.

有谁知道发生了什么?

- - -编辑 - - -

在Andrew Stevlov回答的帮助下,我想通了.我的网址中有一个":",我猜urllib不喜欢这样.我用"%3A"替换它,现在它正在工作.非常感谢你们!

And*_*lov 6

仔细检查你的编译选项,看起来你的盒子有问题。

至少以下代码对我有用:

from urllib.request import urlopen
resp = urlopen('https://github.com')
print(resp.read())
Run Code Online (Sandbox Code Playgroud)


Moh*_*hdi 6

这可能有帮助

忽略 SSL 证书错误

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = input('Enter - ')
html = urllib.request.urlopen(url, context=ctx).read()
Run Code Online (Sandbox Code Playgroud)