使用Google App Engine和Python读取网站XML

2 投票
3 回答
696 浏览
提问于 2025-04-16 13:17

我正在尝试从《魔兽世界》军团的数据库读取一些xml数据(没错,我就是那种人)——像这样的链接 这个 在Firefox浏览器中可以返回xml数据(你需要查看源代码才能看到),但在其他浏览器,比如Chrome中却不能(我也不太明白为什么——不过这不是重点)。

总之,我有一段代码,在我本地运行应用时一切正常,但现在我正在迁移到Google App Engine上,它却不工作了,我也不知道为什么。看起来它无法获取xml数据。我在完整代码中使用了Beautiful Soup来解析xml。

import urllib2,urllib
import socket
from BeautifulSoup import BeautifulStoneSoup

class Object:
    def __init__(self):
        self.data = {}
        self.userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"

    def _getXml(self):
        strFile = ""
        try:
            url = "http://eu.wowarmory.com/guild-info.xml?r=dentarg&n=penance"
            values = {}
            headers = { 'User-Agent' : self.userAgent }
            data = urllib.urlencode(values)
            socket.setdefaulttimeout(2)
            req = urllib2.Request(url, data, headers)
            response = urllib2.urlopen(req)
            strFile = response.read()
        except Exception, e:
            raise e
        finally:
            return strFile

    def getObject(self):
        soup = BeautifulStoneSoup( self._getXml() )
        return soup.guildheader["faction"]

这是主要的代码部分:

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from library import Object


class MainHandler(webapp.RequestHandler):
    def get(self):
        test = Object().getObject()
        self.response.out.write(test)


def main():
    application = webapp.WSGIApplication([('/', MainHandler)],
                                         debug=True)
    util.run_wsgi_app(application)


if __name__ == '__main__':
    main()

我简化了代码,以便更好地说明问题。如果有人能帮我,我将非常感激。

3 个回答

0

暴雪公司把以前的角色信息网站改成了一个新的样式和格式。现在你可能需要直接解析HTML代码了。

0

urllib2.Request 这个东西在你传入数据的时候,会发送一个POST请求。你要搞清楚服务器是不是期待这个请求,还是说你需要发送一个GET请求呢?

另外,现在访问那个网址会显示“我们已经搬家了”的信息。

1

好的,我在http://shell.appspot.com/上玩了一下(顺便说一下,你可以下载源代码,把它整合到你的项目里进行更多实验),这似乎能解决问题:

headers = { 'User-Agent' : ""Mozilla/5.0 (Windows; U; Windows NT 5.0; en-GB; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4" }
resp = urlfetch.fetch(url="http://eu.wowarmory.com/guild-info.xml?r=dentarg&n=penance", method=urlfetch.GET, headers= headers)
print resp.content

撰写回答