1

我有一个 python 程序,它定期检查来自 的天气weather.yahooapis.com,但它总是抛出错误:urllib.HTTPError: HTTP Error 404: Not Found on Accelerator. 我在两台不同的计算机上尝试过,但都没有成功,还更改了我的 DNS 设置。我继续收到错误。这是我的代码:

#!/usr/bin/python

import time
#from Adafruit_CharLCDPlate import Adafruit_CharLCDPlate
from xml.dom import minidom
import urllib2

#towns, as woeids
towns = [2365345,2366030,2452373]

val = 1
while val == 1:
time.sleep(2)
for i in towns:
    mdata = urllib2.urlopen('http://206.190.43.214/forecastrss?w='+str(i)+'&u=f')
    sdata = minidom.parseString(mdata)
    atm = sdata.getElementsByTagName('yweather:atmosphere')[0]
    current = sdata.getElementsByTagName('yweather:condition')[0]
    humid = atm.attributes['humidity'].value
    tempf = current.attributes['temp'].value
    print(tempf)
    time.sleep(8)

我可以通过给我错误的同一台计算机上的 Web 浏览器成功访问 API 的输出。

4

1 回答 1

2

问题是您使用的是 IP 地址206.190.43.214而不是主机名weather.yahooapis.com

即使它们解析到同一个主机(206.190.43.214很明显),实际在 URL 中的名称最终还是作为Host:HTTP 请求中的标头。你可以看出这在这里有所不同:

$ curl 'http://206.190.43.214/forecastrss?w=2365345&u=f'
<404 error>
$ curl 'http://weather.yahooapis.com/forecastrss?w=2365345&u=f'
<correct rss>
$ curl 'http://206.190.43.214/forecastrss?w=2365345&u=f' -H 'Host: weather.yahooapis.com'
<correct rss>

如果您在浏览器中测试这两个 URL,您将看到相同的内容。


因此,在您的代码中,您有两个选择。您可以使用 DNS 名称代替 IP 地址:

mdata = urllib2.urlopen('http://weather.yahooapis.com/forecastrss?w='+str(i)+'&u=f')

… 或者您可以使用 IP 地址并手动添加 Host 标头:

req = urllib2.Request('http://206.190.43.214/forecastrss?w='+str(i)+'&u=f')
req.add_header('Host', 'weather.yahooapis.com')
mdata = urllib2.urlopen(req)

解决此问题后,您的代码中至少还有另一个问题。你不能在什么minidom.parseString(mdata)时候打电话;您要么需要调用事物,要么使用代替.mdataurlopenread()parseparseString

于 2013-10-03T01:40:14.473 回答