【问题标题】:How use Scrapy encodage如何使用 Scrapy 编码
【发布时间】:2015-03-19 13:49:30
【问题描述】:

我在使用 Scrapy 时遇到编码问题,希望有人能帮助我。

  • 在我的蜘蛛上:item['title'] = html.xpath('.//h5/text()')
  • 在管道上:item['title'] = item['title'].extract()[0].encode('utf-8', 'replace')

它的结果字符串类似于Namontana \xe2\x80\x93 Une attaque \xc3\xa0 main arm\xc3\xa9e avort\xc3\xa9e。我将所有项目保存在数据库中(现在是 mysql)。

现在我想向网站显示所有这些项目,但我的问题是我无法将 \xe2(例如)转换为可视字符。

我已经试过了:

  • 在所有 .py 文件的开头添加# -*- coding: utf-8 -*-
  • 使用 PHP 代码显示时使用 htmlentitiesutf8_decode 函数
  • 在我的蜘蛛上添加unicode(response.body.decode(response.encoding)).encode('utf-8')
  • <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 添加到我的 HTML 页面
  • 检查所有文件并将其转换为不带 BOM 的 UTF8

目前,我唯一的选择是使用自定义函数来替换所有字符(解释here),但我认为他们有更好的解决方案。

提前感谢您的帮助。

【问题讨论】:

    标签: python mysql encoding utf-8 scrapy


    【解决方案1】:

    e28093 是用于 EN DASH 的 utf8 编码的十六进制:http://www.fileformat.info/info/unicode/char/2013/index.htm

    c3a0 和 c3a9 代表重音字母:

    mysql> SELECT UNHEX('e28093c3a0c3a9');
    +-------------------------+
    | UNHEX('e28093c3a0c3a9') |
    +-------------------------+
    | –àé                     |
    +-------------------------+
    

    我不知道是什么提供了“\x”,但这是十六进制的常见前导。

    如果 SELECT 带有 \x 等,那么这不是存储数据的好方法。如果SELECT HEX(column) 提出...e28093...,那很好。

    【讨论】:

      【解决方案2】:

      问题来自我的数据库编码。现在是 utf8_unicode_ci,效果很好。

      【讨论】:

        【解决方案3】:

        我的解决方案是添加

        # -*- coding: utf-8 -*-
        

        在每个文件(蜘蛛、管道等)上并将(在管道上)字符串从 unicode 转换为 utf8 [.encode( 'utf-8', 'replace' )]

        【讨论】:

          猜你喜欢
          • 2014-04-03
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多