在使用Python 3.1、urllib和json打开网址时出现错误:尝试对非套接字操作。
我在用Python 3.1、urllib和json打开一个网站链接时遇到了错误。
错误信息是:urllib.error.URLError:
这是我的代码。第一个网站可以正常加载,但第二个网站却出问题了。
import json
import urllib.request
import urllib.parse
import util
# This one works fine
response = urllib.request.urlopen('http://python.org/')
html = response.read()
print(html)
# parms - CSV filename, company, ....
p_filename = "c:\\temp\\test.csv"
jg_token = "zzzzzzzzzzzzzzzzzzzzzzzzz"
jg_proto = "https://"
jg_webst = "www.jigsaw.com/rest/"
jg_cmd_searchContact = "searchContact.json"
jg_key_companyName = "companyName"
jg_key_levels = "levels"
jg_key_departments = "departments"
jg_args = {
"token":jg_token,
jg_key_companyName: "Technical Innovations",
jg_key_departments: "HR"
}
jg_url = jg_proto + jg_webst + jg_cmd_searchContact + "?" + urllib.parse.urlencode(jg_args)
# This one generates teh error
result = json.load(urllib.request.urlopen(jg_url))
错误信息是:urllib.error.URLError:
在文件 "c:\dev\xdev\PyJigsaw\searchContact.py" 的第46行,出错的代码是:
result = json.load(urllib.request.urlopen(jg_url))
在文件 "c:\dev\tdev\Python31\Lib\urllib\request.py" 的第121行,出错的代码是:
return _opener.open(url, data, timeout)
在文件 "c:\dev\tdev\Python31\Lib\urllib\request.py" 的第349行,出错的代码是:
response = self._open(req, data)
在文件 "c:\dev\tdev\Python31\Lib\urllib\request.py" 的第367行,出错的代码是:
'_open', req
在文件 "c:\dev\tdev\Python31\Lib\urllib\request.py" 的第327行,出错的代码是:
result = func(*args)
在文件 "c:\dev\tdev\Python31\Lib\urllib\request.py" 的第1098行,出错的代码是:
return self.do_open(http.client.HTTPSConnection, req)
在文件 "c:\dev\tdev\Python31\Lib\urllib\request.py" 的第1075行,出错的代码是:
raise URLError(err)
2 个回答
请编辑标题和标签,甚至可能需要修改问题内容:
这和JSON没有关系,完全是Windows的问题。而且这个问题比urllib更底层。(可能是在SSL代码里。)简单来说:
以下两种方法在Vista的Python 3.1.2上都无法使用,但在Linux(Python 3.1.3)上运行得很好:
print( HTTPSConnection(hostname).request('GET',url).getresponse().read() )
print( urllib.request.urlopen('https://'+hostname+url).read() )
把它们改成不使用SSL,然后在Windows上就能正常工作了:
print( HTTPConnection(hostname).request('GET',url).getresponse().read() )
print( urllib.request.urlopen('http://'+hostname+url).read() )
在Vista系统上,我刚刚把Python从3.1.2升级到了3.2,现在这个问题就解决了。
现在下面这行代码可以正常运行了:
print( urllib.request.urlopen('https://'+hostname+url).read() )