GAE Python LXML-XMLSyntaxError规范为属性对象指定值

GAE Python LXML-XMLSyntaxError规范为属性对象指定值,python,google-app-engine,lxml,iterparse,Python,Google App Engine,Lxml,Iterparse,我在Python上使用GoogleAppEngine,试图获取一个Gzip XML文件,并用LXML的iterparse解析它。我使用lxml.de中的示例创建了以下代码: import gzip, base64, StringIO from lxml import etree from google.appengine.ext import webapp from google.appengine.api.urlfetch import fetch class Catalog(webapp.

我在Python上使用GoogleAppEngine,试图获取一个Gzip XML文件,并用LXML的iterparse解析它。我使用lxml.de中的示例创建了以下代码:

import gzip, base64, StringIO
from lxml import etree
from google.appengine.ext import webapp
from google.appengine.api.urlfetch import fetch

class Catalog(webapp.RequestHandler):
user = xxx
password = yyy
catalog = fetch('url',
                    headers={"Authorization": 
                             "Basic %s" % base64.b64encode(user + ':' + password)}, deadline=600)
items = etree.iterparse(StringIO.StringIO(catalog), tag='product')

for _, element in items:
    print('%s -- %s' % (element.findtext('name'), element[1].text))
    element.clear()
当我运行它时,会出现以下错误:

for _, element in coupons:
File "iterparse.pxi", line 491, in lxml.etree.iterparse.__next__ (src/lxml\lxml.etree.c:98565)
File "iterparse.pxi", line 543, in lxml.etree.iterparse._read_more_events (src/lxml\lxml.etree.c:99086)
File "parser.pxi", line 590, in lxml.etree._raiseParseError (src/lxml\lxml.etree.c:74791)
XMLSyntaxError: Specification mandate value for attribute object, line 1, column 53

这个错误意味着什么?我猜XML文件的格式不正确,但是我不知道从哪里查找问题。任何帮助都将不胜感激

通过以不同方式处理fetch/gzip部分、激活异步请求和使用webapp2,问题得以解决。当使用所有这些时,它都起作用了:)下面是代码:

from google.appengine.api.urlfetch import fetch
import gzip, webapp2, base64, StringIO, datetime
from credentials import CJCredentials
from lxml import etree

class Catalog(webapp2.RequestHandler):
def get(self):
    user = xxx
    password = yyy
    url = 'some_url'

    catalogResponse = fetch(url, headers={
        "Authorization": "Basic %s" % base64.b64encode(user + ':' + password)
    }, deadline=10000000)

    f = StringIO.StringIO(catalogResponse.content)
    c = gzip.GzipFile(fileobj=f)
    content = c.read()

    xml = StringIO.StringIO(content)

    tree = etree.iterparse(xml, tag='product')

    for event, element in tree:
       print element.name

你不是说xml被压缩了吗?你在哪里解压?另外,错误消息说错误在第1行第53列。据我所知,LXML自动处理GZip,这就是为什么我没有解压缩它。现在我读到它在第1行,第53列,但这是什么意思?XML文件中的产品每个都有21个标记,所以从逻辑上讲,我希望它是第三个产品的第11列,但没有什么错。一般来说,该文件的格式很好,所以我怀疑问题出在其他地方。行items=etree.iterparse(StringIO.StringIO(catalog),tag='product')应该是items=etree.iterparse(StringIO.StringIO(catalog.content),tag='product')。谢谢您的建议。我尝试了这个方法,但它返回“XMLSyntaxError:documentisempty,第1行,第1列”。我会给你的网址,但它有凭据,我不能分享。在Stackoverflow上共享此GZip文件这样的文档最常见的方法是什么?因此,如果您获取的文档为空错误,可能意味着fetch调用没有返回文件的内容。首先确保返回代码成功且内容正确。有关详细信息,请参阅。