2012-07-07 35 views
1

第一次使用這個東西。 檢查了關於內部化/文本編碼的所有其他SOF問題。Scrapy檢索不正確的文本編碼,希伯來文爲 u0d5等

我做的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,我沒有任何關係到博客或博客所有者,我只是用它作爲例子)

+0

什麼是真正奇怪的,使用'scrapy視圖'顯示我希伯來語,使用'scrapy取'顯示我jibberish。 – mirandalol 2012-07-07 12:57:23

+0

還有一些進展,我用這行'filename = response.url。我在我的蜘蛛分析方法裏面打開(filename,'wb')。write(response.body)來生成一個包含URL的文件HTML,並且在我打開Notepad ++的時候;它是亂碼,但如果我改變編碼 - >字符集 - >希伯來文 - > windows-1255,我完全看到了希伯來文。我如何將這種行爲轉化爲Scrapy? – mirandalol 2012-07-07 13:16:17

+0

可能的重複:http://stackoverflow.com/q/7185755/1344461 – C0deH4cker 2012-07-07 14:03:05

回答

0

您是否嘗試過在存儲該信息時看到的是什麼你從頁面的某個地方得到json,xml ....

我在幾個網站上遇到了一些問題,並且在大多數情況下,如果您沒有對檢索到的數據進行任何操作,但是如果您嘗試在控制檯中打印它們,您將無法獲得正確的結果,或者它會給錯誤,如果你不使用repr

print repr(data) 

我希望這有助於,因爲我知道編碼問題的挫折。

+0

當我使用feed導出導出到JSON文件時,它是完全一樣的。 – mirandalol 2012-07-07 12:21:25

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 

結果:

[email protected]:~/projects/snippets$ python test.py 
מי אנס פוטנציאלי? 
מי אנס פוטנציאלי? 
[email protected]:~/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() 
+0

但它被寫入文件中。由於它是「unicode」而不是字符串,所以我無法對其執行方法,比如替換,所以你說的話對我沒有幫助。 – mirandalol 2012-07-07 13:47:02

+0

@Saga:不正確。這些方法仍然在這裏解釋:http://docs.python.org/howto/unicode.html – C0deH4cker 2012-07-07 14:20:30

+0

@Saga,我想我不明白你的問題。你可以做一個測試用例來展示你的問題(爲了演示你的問題:「但是它被寫入文件中,因爲它是」unicode「而不是字符串,所以我不能對它執行方法,例如替換」 )? – warvariuc 2012-07-07 15:37:27