如何使用Scrapy编码
How use Scrapy encodage
我在使用 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 -*-
- 使用
htmlentities
或 utf8_decode
函数显示 PHP 代码
- 在我的蜘蛛上添加
unicode(response.body.decode(response.encoding)).encode('utf-8')
- 将
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
添加到我的 HTML 页面
- 检查所有文件并将其转换为无 BOM 的 UTF8
目前,我唯一的选择是使用自定义函数替换所有字符(解释 here),但我认为他们有更好的解决方案。
在此先感谢您的帮助。
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...
,那很好。
问题来自我的数据库编码。现在是 utf8_unicode_ci,效果很好。
我的解决方案是添加
# -*- coding: utf-8 -*-
在每个文件(蜘蛛、管道等)上并将(在管道上)字符串从 unicode 转换为 utf8 [.encode( 'utf-8', 'replace' )]
我在使用 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 -*-
- 使用
htmlentities
或utf8_decode
函数显示 PHP 代码 - 在我的蜘蛛上添加
unicode(response.body.decode(response.encoding)).encode('utf-8')
- 将
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
添加到我的 HTML 页面 - 检查所有文件并将其转换为无 BOM 的 UTF8
目前,我唯一的选择是使用自定义函数替换所有字符(解释 here),但我认为他们有更好的解决方案。
在此先感谢您的帮助。
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...
,那很好。
问题来自我的数据库编码。现在是 utf8_unicode_ci,效果很好。
我的解决方案是添加
# -*- coding: utf-8 -*-
在每个文件(蜘蛛、管道等)上并将(在管道上)字符串从 unicode 转换为 utf8 [.encode( 'utf-8', 'replace' )]