繼續寫爬蟲ing,又踩坑裏了。。。。一個網頁,裏面的部分中文是正面這個樣子的:python
已转出
看完後個人心裏是近乎崩潰的。。。app
生活不易,還得繼續。查了 百度,google都沒有好的答案,偶然間發現了知乎上有關講解:google
http://www.zhihu.com/question/21390312編碼
形如—— &#dddd; &#xhhhh; &#name; ——的一串字符是 HTML、XML 等 SGML 類語言的轉義序列(escape sequence)。它們不是「編碼」。 以 HTML 爲例,這三種轉義序列都稱做 character reference: 前兩種是 numeric character reference(NCR),數字取值爲目標字符的 Unicode code point;以「&#」開頭的後接十進制數字,以「&#x」開頭的後接十六進制數字。 後一種是 character entity reference,後接預先定義的 entity 名稱,而 entity 聲明瞭自身指代的字符。 從 HTML 4 開始,NCR 以 Unicode 爲準,與文檔編碼無關。 「中國」二字分別是 Unicode 字符 U+4E2D 和 U+56FD,十六進制表示的 code point 數值「4E2D」和「56FD」就是十進制的「20013」和「22269」。因此—— 中国 中国 ——這兩種 NCR 寫法都會在顯示時轉換爲「中國」二字。 做者:梁海 連接:http://www.zhihu.com/question/21390312/answer/18091465 來源:知乎 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
說白了就是unicode編碼的十進制表示,再加上一些點綴("&#"與";")。因此呢,知道了原理就好辦多了。 無非就是把十進制轉換爲十六進制。用python寫了個轉換方法以下:code
def ncr_to_unicode(text): """ 用於將北京這類NCR(numeric character reference)字符串轉換爲unicode串 :param text: NCR strings such as "已转出" :return: unicode strings such as "\u5df2\u8f6c\u51fa" usage: print print unicode(ncr_to_unicode(code), 'unicode-escape') """ l_text_unicode = [] l_word = text[:-1].split(';') for word in l_word: word = word[2:] word_hex = hex(int(word)) word_uni = '\u' + word_hex[2:] l_text_unicode.append(word_uni) return ''.join(l_text_unicode)