在使用Python 3.1、urllib和json打开网址时出现错误:尝试对非套接字操作。

2 投票
2 回答
1767 浏览
提问于 2025-04-15 23:34

我在用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 个回答

1

请编辑标题和标签,甚至可能需要修改问题内容:

这和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() )
1

在Vista系统上,我刚刚把Python从3.1.2升级到了3.2,现在这个问题就解决了。

现在下面这行代码可以正常运行了:

print( urllib.request.urlopen('https://'+hostname+url).read() )

撰写回答