2012-10-04 19 views
2

我正在解析包含許多特殊字符(包括Unicode和HTML實體形式)的HTML文件。 儘管已經閱讀了大量有關Python與Unicode的文檔,但我仍然無法正確轉換HTML實體。在Python中轉義HTML實體和UTF-8

這裏是我跑的測試:

>>> import HTMLParser 
>>> p = HTMLParser.HTMLParser() 
>>> s = p.unescape("‹") 
>>> repr(s) 
"u'\\x8b'" 
>>> print s 
‹ # !!! 
>>> s 
u'\x8b' 
>>> print s.encode("latin1") 
‹ # OK, it prints fine in latin1, but I need UTF-8 ... 
>>> print s.encode("utf8") 
‹ # !!! 

>>> import codecs 
>>> out = codecs.open("out8.txt", encoding="utf8", mode="w") 
>>> out.write(s) 
# Viewing the file as ANSI gives me ‹ # !!! 
# Viewing the file as UTF8 gives NOTHING, as if the file were empty # !!! 

什麼是寫作的轉義字符串s到UTF8文件的正確方法是什麼?

+1

您是否在Windows中的命令提示符下,偶然? –

+0

如果您的交互式會話本身在utf-8終端上運行,您將只能看到UTF-8編碼打印的正確輸出。它不是,因爲如果它在哪裏,編碼爲「latin1」的打印將會失敗。 – jsbueno

+0

爲了解決有關會話編碼的問題,'locale'命令的輸出確認它是UTF-8。 (我在Linux下) –

回答

3

U + 008B是一個控制字符,因此沒有什麼是不尋常的。 「<」是U + 2039單左指向角引號,甚至在Latin-1中也不是。它,然而,字符0x8B在CP1252。並且停止依靠Windows控制檯輸出來告訴您什麼是正確的,除非事先運行chcp 65001

+0

我通過SSH使用Linux控制檯。從你的解釋中,我可以推斷'unescape()'函數存在一個錯誤,它返回U + 008B而不是U + 2039。我錯了嗎 ? –

+1

該錯誤在數據中。或者更具體地說,無論是生成數據。它應該使用'‹'來編碼字符,但是自私地認爲這個世界圍繞着微軟並且使用了一個字符[不存在於正確的規範中](http://www.w3.org/TR/) HTML4/SGML/entities.html)。 –

+1

不錯的鏈接,我沒有找到完整的HTML實體列表。你是對的,數據違反了規範。使用‹運行我的測試可得到預期結果。 –