ImportError в Google App Engine с lxml

Я использую lxml для анализа страниц. Когда я запускаю свой код с помощью sdk движка приложения, он работает, но когда я развертываю свое приложение в облаке, я получаю здесь сообщение:

Отслеживание (последний вызов последним): файл "/base/data/home/apps/s~testparsercyka/1.356245976008257055/handler_info.py", строка 2, в файле импорта lxml.html "/ base / data / home / apps / s ~ testparsercyka / 1.356245976008257055 / lxml / html / init .py ", строка 12, из lxml import etree ImportError: невозможно импортировать имя etree

Код:

app.yaml



    application: testparsercyka
    version: 1
    runtime: python27
    api_version: 1
    threadsafe: false

    handlers:
    - url: /stylesheets
      static_dir: stylesheets

    - url: /.*
      script: handler_info.py

    libraries:
    - name: lxml
      version: "2.3"  # I thought this would allow me to use lxml.etree

handler_info.py



    import lxml
    import lxml.html
    import urllib
    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app
    from google.appengine.ext.webapp import template
    import os
    import cgi
    class MainPage(webapp.RequestHandler):
        def get(self):
            template_values = {}
            path = os.path.join(os.path.dirname(__file__), 'index.html')
            self.response.out.write(template.render(path, template_values))
    class Handlers(webapp.RequestHandler):
        def post(self):
            #url = "http://habrahabr.ru/"
            url = str(self.request.get('url'))
            url_temp = url
            teg = str(self.request.get('teg'))
            attr = str(self.request.get('attr'))
            n0 = str(self.request.get('n0'))
            n = str(self.request.get('n'))
            a = attr.split(':')
            for i in range(int(n0),int(n)):
                url = url.format(str(i))
                self.response.out.write(url)
                html = urllib.urlopen(url).read()       
                doc = lxml.html.document_fromstring(html)
                url = url_temp
                self.getn(doc.getroottree().getroot(),teg,a)
        def getn(self,node,teg,a):
                if ((node.tag==teg) and (node.get(a[0])==a[1])):
                    #print node.tag,node.keys()
                    self.response.out.write(node.text)
                    self.response.out.write('
') for n in node: self.getn(n,teg,a) application = webapp.WSGIApplication([('/', MainPage),('/sign',Handlers)],debug=True) def main(): run_wsgi_app(application) if __name__ == "__main__": main()

Есть идеи, почему это не работает?


person artem    schedule 21.01.2012    source источник
comment
Привет, Артем, у меня аналогичная проблема, за исключением того, что я получаю ошибку импорта, когда нахожусь в SDK, поэтому я еще не пробовал на серверах Google. Вам приходилось самостоятельно устанавливать lxml на свой компьютер? Интересно, это моя проблема, но я предполагал, что это будет с SDK ...   -  person Stin    schedule 24.03.2012


Ответы (1)


Я знаю, что это старый вопрос, но вот ответ, который, как я подтвердил, работает при развертывании в App Engine:

app.yaml

application: lxml-test
version: 1
runtime: python27
api_version: 1
threadsafe: false

handlers:
- url: /.*
  script: app.app

libraries:
- name: lxml
  version: "2.3"

- name: webapp2
  version: "latest"

app.py

import webapp2
import lxml.etree

class MainPage(webapp2.RequestHandler):
    def get(self):
        root = lxml.etree.XML('<top><content>Hello world!</content></top>')
        self.response.content_type = 'text/xml'
        self.response.write(lxml.etree.tostring(root, xml_declaration=True))

app = webapp2.WSGIApplication(routes=[('/', MainPage)], debug=True)

Итак, с точки зрения сравнения приведенного выше с вашим кодом, могут помочь некоторые из следующих изменений:

  1. Измените script: hander_info.py на script: handler_info.application.
  2. Используйте webapp2, который немного лучше и новее, чем webapp.

Также возможно, что проблема просто решилась сама собой с 2012 года, когда был задан этот вопрос.

person dlebech    schedule 18.04.2015