2012-01-21 18 views
8

Uso lxml para analizar las páginas. Cuando ejecuto mi código con el SDK de App Engine funciona, pero cuando despliego mi aplicación en la nube, me sale un messege aquí:ImportError en Google App Engine con lxml

Traceback (most recent call last): File "/base/data/home/apps/s~testparsercyka/1.356245976008257055/handler_info.py", line 2, in import lxml.html File "/base/data/home/apps/s~testparsercyka/1.356245976008257055/lxml/html/init.py", line 12, in from lxml import etree ImportError: cannot import name etree

Código:

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()

¿Alguna idea de por qué esto no funciona?

+0

Hola artem, estoy teniendo un problema similar, excepto que recibo el error de importación cuando estoy en el SDK, así que aún no lo he probado en los servidores de Google. ¿Tuviste que instalar lxml en tu computadora tú mismo? Me pregunto si ese es mi problema, pero supuse que vendría con el SDK ... – Stin

Respuesta

2

Sé que esto es una vieja pregunta, pero aquí es una respuesta que me han confirmado a trabajar cuando se implementa en 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) 

Por lo tanto, en términos de comparar lo anterior con su código, algunos de los siguientes cambios pueden t ayuda:

  1. Cambio script: hander_info.py-script: handler_info.application.
  2. Use webapp2, que es un poco mejor y más nuevo que webapp.

También es posible que el problema se haya resuelto solo desde 2012 cuando se formuló esta pregunta.