我正在尝试获取 XML 文件并将其解析到数据库中。XML 在 GZIP 中压缩。GZIP 文件约为 8MB。当我在本地运行代码时,pythonw.exe 上的内存累积到整个系统(Windows 7)停止响应的水平,当我在线运行它时,它超过了 Google App Engine 上的内存限制。不确定文件是否太大或者我做错了什么。任何帮助将不胜感激!
from google.appengine.ext import webapp
from google.appengine.api.urlfetch import fetch
from xml.dom.minidom import parseString
import gzip
import base64
import StringIO
class ParseCatalog(webapp.RequestHandler):
user = xxx
password = yyy
catalog = fetch('url',
headers={"Authorization":
"Basic %s" % base64.b64encode(user + ':' + password)}, deadline=600)
xmlstring = StringIO.StringIO(catalog.content)
gz = gzip.GzipFile(fileobj=xmlstring)
gzcontent = gz.read()
contentxml = parseString(gzcontent)
items = contentxml.getElementsByTagName("Product")
for item in items:
item = DatabaseEntry()
item.name = str(coupon.getElementsByTagName("Manufacturer")[0].firstChild.data)
item.put()
更新
所以我尝试按照 BasicWolf 的建议切换到 LXML,但在导入它时遇到问题。我下载了 LXML 2.3 库并将其放在我的应用程序的文件夹中(我知道这并不理想,但这是我知道如何包含第 3 方库的唯一方法)。此外,我在 app.yaml 中添加了以下内容:
libraries:
- name: lxml
version: "2.3"
然后我写了下面的代码来测试它是否解析:
import lxml
class ParseCatalog(webapp.RequestHandler):
user = xxx
password = yyy
catalog = fetch('url',
headers={"Authorization":
"Basic %s" % base64.b64encode(user + ':' + password)}, deadline=600)
items = etree.iterparse(catalog.content)
def get(self):
for elem in items:
self.response.out.write(str(elem.tag))
但是,这会导致以下错误:
ImportError: cannot import name etree
我已经检查了有关此错误的其他问题,看来我在 Windows 7 上运行的事实可能会起作用。我还尝试从http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml安装预编译的二进制包,但这也没有改变任何东西。