我正在尝试使用urllib2.urlopen解决问题。它似乎无法使用我的常规DNS服务器。下面是几次尝试打开各种URL的结果,首先使用Google公共DNS(8.8.8.8),然后使用我的路由器。 gridley在我的/ etc / hosts文件中定义。
Python 2.7.2 (default, Jun 29 2011, 11:17:09)
[GCC 4.6.1] on linux2
>>> import urllib2
>>> urllib2.urlopen("http://gridley")
<addinfourl at 158490988 whose fp = <socket._fileobject object at 0xb745f7ec>>
>>> urllib2.urlopen("http://google.com")
<addinfourl at 158492204 whose fp = <socket._fileobject object at 0x971842c>>
Python 2.7.2 (default, Jun 29 2011, 11:17:09)
[GCC 4.6.1] on linux2
>>> import urllib2
>>> urllib2.urlopen("http://gridley")
<addinfourl at 154808684 whose fp = <socket._fileobject object at 0xb73997ec>>
>>> urllib2.urlopen("http://google.com")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 394, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 412, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 372, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1199, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1174, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno -5] No address associated with hostname
然而,使用dig查询google.com表明它肯定应该有效:
; <<>> DiG 9.8.1 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44377
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 190 IN A 74.125.225.83
google.com. 190 IN A 74.125.225.81
google.com. 190 IN A 74.125.225.82
google.com. 190 IN A 74.125.225.80
google.com. 190 IN A 74.125.225.84
;; Query time: 23 msec
;; SERVER: 192.168.7.254#53(192.168.7.254)
;; WHEN: Sun Sep 18 19:46:12 2011
;; MSG SIZE rcvd: 108
IPv6引起了一些其他问题,但它现在已经完全关闭了,所以不可能。到底是怎么回事?
答案 0 :(得分:1)
这不是一个答案......但请注意,使用dig
不会像urlopen
那样查找主机名。 dig
严格来说是一个DNS查询工具,而您的系统可能配置为在多个源(本地主机文件,NIS,LDAP等)中查找主机信息。
键入时:
urllib2.urlopen("http://google.com")
您的操作可能会检查多个来源。在Linux系统上,检查的确切内容由hosts
中的/etc/nsswitch.conf
条目控制。您可以使用getent
工具以类似于urlopen
正在执行的方式检查主机名外观:
getent hosts google.com
您的问题没有提到您正在使用的操作系统,也没有明确说明第一个和第二个示例之间的更改(编辑文件?更改首选项对话框中的设置?)。
如果您使用的是Linux,包括resolv.conf
之前和之后的任何更改,以及nsswitch.conf
可能有助于诊断问题。如果您不在Linux上,指定您的操作系统可能会带来更多有用的答案。