【问题标题】:python appengine unicodeencodeerror on search api snippeted results搜索api片段结果上的python appengine unicodeencodeerror
【发布时间】:2013-03-19 22:15:57
【问题描述】:

我正在抓取页面并使用 appengine 搜索 api(西班牙语和加泰罗尼亚语页面,带有重音字符)对它们进行索引。我能够执行搜索并制作结果页面。

当我尝试使用带有 snipetted_fields 的查询对象时出现问题,因为它总是会生成 UnicodeEncodeError:

  File "/home/otger/python/jobs-gae/src/apps/search/handlers/results.py", line 82, in find_documents
    return index.search(query_obj)
  File "/opt/google_appengine_1.7.6/google/appengine/api/search/search.py", line 2707, in search
    apiproxy_stub_map.MakeSyncCall('search', 'Search', request, response)
  File "/opt/google_appengine_1.7.6/google/appengine/api/apiproxy_stub_map.py", line 94, in MakeSyncCall
    return stubmap.MakeSyncCall(service, call, request, response)
  File "/opt/google_appengine_1.7.6/google/appengine/api/apiproxy_stub_map.py", line 320, in MakeSyncCall
    rpc.CheckSuccess()
  File "/opt/google_appengine_1.7.6/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitImpl
    self.request, self.response)
  File "/opt/google_appengine_1.7.6/google/appengine/ext/remote_api/remote_api_stub.py", line 200, in MakeSyncCall
    self._MakeRealSyncCall(service, call, request, response)
  File "/opt/google_appengine_1.7.6/google/appengine/ext/remote_api/remote_api_stub.py", line 234, in _MakeRealSyncCall
    raise pickle.loads(response_pb.exception())
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 52: ordinal not in range(128)

我在 stackoverflow 上发现了一个类似的问题:GAE Full Text Search development console UnicodeEncodeError 但它说这是在 1.7.0 上修复的错误。使用 1.7.5 和 1.7.6 版本时,我会遇到同样的错误。

在索引页面时,我添加了两个字段:description 和 description_ascii。如果我尝试为 description_ascii 生成 sn-ps,它会完美运行。

这是否可以在 dev_appserver 上生成非 ascii 内容的 sn-ps?

【问题讨论】:

    标签: python google-app-engine google-search-api


    【解决方案1】:

    我认为这是一个错误,报告了新的缺陷问题https://code.google.com/p/googleappengine/issues/detail?id=9335

    开发服务器的临时解决方案 - 找到 google.appengine.api.search 模块 (search.py​​),并通过添加内联来修补函数 _DecodeUTF8,如果这样:

    def _DecodeUTF8(pb_value):
      """Decodes a UTF-8 encoded string into unicode."""
      if pb_value is not None:
        return pb_value.decode('utf-8') if not isinstance(pb_value, unicode) else pb_value
      return None
    

    解决方法 - 在问题解决之前自行实现 sn-p 功能 - 假设 sn-p 的基础字段称为 snippet_base:

    query = search.Query(query_string=query_string,
                     options=
                        search.QueryOptions(
                            ...
                            returned_fields= [... 'snippet_base' ...]
                            ))
    results = search.Index(name="<index-name>").search(query)
    if results:
        for res in results.results:
            res.snippet = some_snippeting_function(res.field("snippet_base"))
    

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2011-08-27
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多