Ubuntu 18.04中urllib.request.urlopen的奇怪行为

时间:2019-04-20 20:20:42

标签: python-3.x urllib

我已经在Coursera上完成了有关python的在线课程(这不是家庭作业),并且在urllib.request.urlopen中遇到了一些URL问题。对于以下代码中硬编码的url,命令urllib.request.urlopen(serviceurl,context = ctx).read()。decode()超时。如果使用了另一个URL,则说http://www.woot.com被使用,将返回数据。

我已经在我所在的两台单独的Ubuntu计算机上尝试了此方法,它们都分别通过Anaconda运行18.04(默认为3.6.7)和3.7.3。 我什至以同样的结果重新安装了Ubuntu。

奇怪的是,如果我包含一个超时参数(例如urllib.request.urlopen(serviceurl,timeout = 1,context = ctx).read()。decode()),则会返回数据。

此外,此程序在运行3.6.4的macbook air上成功运行(无论URL如何)且没有超时参数

import urllib.request
import ssl


# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

address = input('Enter Locaton: ')
if len(address) < 1:
    serviceurl = 'http://py4e-data.dr-chuck.net/comments_42.xml?'
else:
    serviceurl = address

s = urllib.request.urlopen(serviceurl, context=ctx).read().decode()
print(s)

我似乎是唯一遇到此问题的人,这让我感到困惑。我才刚刚开始熟悉python(对C,C#,Java更为熟悉)。任何想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

回答(我认为)我自己的问题。看起来该网站不喜欢IP6套接字。能够将挂起追溯到socket.py。创建连接中使用的第一个地址是IP6地址和端口,该地址不返回任何内容。添加超时导致代码从列表中选择IP4且有效的下一个地址和端口。我暂时在Ubuntu 18.04中禁用IP6以强制使用IP4。