GAE Python LXML-XMLSyntaxError规范为属性对象指定值
我在Python上使用GoogleAppEngine,试图获取一个Gzip XML文件,并用LXML的iterparse解析它。我使用lxml.de中的示例创建了以下代码: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.
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调用没有返回文件的内容。首先确保返回代码成功且内容正确。有关详细信息,请参阅。