2012-01-21 35 views
8

Tôi sử dụng lxml để phân tích các trang. Khi tôi chạy mã của tôi với sdk công cụ ứng dụng nó hoạt động, nhưng khi tôi triển khai ứng dụng của tôi trong đám mây, tôi nhận được một tin thông báo ở đây:NhậpError trên Google App Engine với 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

Code:

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

Bất kỳ ý tưởng nào tại sao tính năng này không hoạt động?

+0

Hi artem, tôi gặp sự cố tương tự, ngoại trừ tôi gặp lỗi nhập khi ở trong SDK, vì vậy tôi chưa thử trên máy chủ của google. Bạn có phải tự cài đặt lxml trên máy tính của mình không? Tôi tự hỏi nếu đó là vấn đề của tôi, nhưng tôi cho rằng nó sẽ đi kèm với SDK ... – Stin

Trả lời

2

Tôi biết đây là một câu hỏi cũ nhưng đây là một câu trả lời mà tôi đã xác nhận để làm việc khi triển khai tới 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) 

Vì vậy, về mặt so sánh ở trên với mã của bạn, một số thay đổi sau đây sẽ thay đổi t help:

  1. Thay đổi script: hander_info.py thành script: handler_info.application.
  2. Sử dụng webapp2 đẹp hơn và mới hơn webapp.

Cũng có thể sự cố đã được giải quyết đơn giản từ năm 2012 khi câu hỏi này được hỏi.