Scrapy检索文本编码不正确,希伯来语为\ u0d5等

时间:2012-07-07 10:58:22

标签: python unicode encoding scrapy

第一次使用这些东西。 查看了有关内部化/文本编码的所有其他SOF问题。

当我遇到这个部分时,我正在做Scrapy教程:Extracting Data, 当我提取数据时,文本而不是希伯来语显示为一系列\ uXXXX。

您可以通过抓取this page来检查它;

scrapy shell http://israblog.nana10.co.il/blogread.asp?blog=167524&blogcode=13348970
hxs.select('//h2[@class="title"]/text()').extract()[0]

这将检索

u'\u05de\u05d9 \u05d0\u05e0\u05e1 \u05e4\u05d5\u05d8\u05e0\u05e6\u05d9\u05d0\u05dc\u05d9?'

(无关:)如果您尝试在控制台中打印它,您会得到:     Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\encodings\cp437.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_map) UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: cha racter maps to <undefined>

尝试通过设置设置编码,尝试手动转换,基本上我觉得我尝试了一切。

(我已经离开了大约5只番茄试图解决这个问题!)

我该怎么做才能获得应该存在的希伯来语文本:“מי אנס פוטנציאלי?

(免责声明:我刚进入第一篇博客和帖子,我注意到http://Israblog.co.il,我与博客或博客所有者无关,我只是以它为例)

2 个答案:

答案 0 :(得分:2)

  

我该怎么做才能获得应该存在的希伯来语文本:“מיאנס   פוטנציאלי?“

test.py

# coding: utf-8

a = u'\u05de\u05d9 \u05d0\u05e0\u05e1 \u05e4\u05d5\u05d8\u05e0\u05e6\u05d9\u05d0\u05dc\u05d9?'
b = 'מי אנס פוטנציאלי?'

print a
print b

结果:

vic@wic:~/projects/snippets$ python test.py 
מי אנס פוטנציאלי?
מי אנס פוטנציאלי?
vic@wic:~/projects/snippets$

如你所见,它们是一样的。它只是同一个unicode字符串的不同表示。所以不要担心它没有被正确删除。

如果要将其保存到文件中:

Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
>>> a = u'\u05de\u05d9 \u05d0\u05e0\u05e1 \u05e4\u05d5\u05d8\u05e0\u05e6\u05d9\u05d0\u05dc\u05d9'
>>> a
u'\u05de\u05d9 \u05d0\u05e0\u05e1 \u05e4\u05d5\u05d8\u05e0\u05e6\u05d9\u05d0\u05dc\u05d9'
>>> f = open('test.txt', 'w')
>>> f.write(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
>>> f.write(a.encode('utf-8'))
>>> f.close()

答案 1 :(得分:0)

你是否曾试图在json,xml中存储从页面获取的信息时得到什么....

我在一些网站上遇到了一些问题但在大多数情况下,如果你没有对检索到的数据做任何事情,它就会得到正确的存储,但是如果你试图在控制台中打印它们就不会得到正确的结果,如果你不使用repr,它会给出错误

print repr(data)

我希望这会有所帮助,因为我知道编码问题的挫败感。