Чтение XML сайта с помощью Google App Engine и Python - PullRequest
2 голосов
/ 08 марта 2011

Я пытаюсь прочитать XML из мира оружия Warcraft (да, я один из них) - URL, такой как this , возвращает XML в Firefox (вам нужно просмотреть увидеть это), но не в других браузерах, таких как Chrome (что я не совсем понимаю, почему - хотя это в стороне).

В любом случае у меня есть этот код, который прекрасно работает, когда я запускаю приложение локально, но сейчас я перехожу на Google App Engine, это не так, и я не знаю почему. Но, похоже, не удается получить XML. Я использовал Beautiful Coup для анализа 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 ]

1 голос
/ 09 марта 2011

Хорошо, я играл с 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
0 голосов
/ 09 марта 2011

Blizzard изменили старый арсенал на новый макет и формат сайта. Вероятно, вам нужно проанализировать HTML-код прямо сейчас.

0 голосов
/ 08 марта 2011

urllib2.Request делает POST, когда вы передаете параметр данных.Это то, что ожидает сервер, или вам нужно выполнить GET?

Кроме того, переход по этому URL теперь просто дает сообщение «мы переехали».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...