\xa0
表示不間斷空白符,爬蟲中遇到它的概率不可謂不小,而經常和它一同出現的還有
\u3000
、
\u2800
、
\t
等Unicode字符串。單從對
\xa0
、
\t
、
\u3000
等含空白字符的處理來說,有以下幾種方法可行:
使用re.sub
使用正則表達式可以輕松匹配所有空白字符,它對於Unicode字符也是有效的,比如:
import re s = 'T-shirt\xa0\xa0短袖圓領衫,\u3000體恤衫\xa0買一件\t吧' re.sub('\s', ' ', s) #T-shirt 短袖圓領衫, 體恤衫 買一件 吧
不過該正則表達式會對所有字符都進行統一處理,可能會與原頁面展示效果有所出入。
使用translate
方法
str
對象的translate
方法也是去除這些字符串的好幫手,該方法具體用法可參考Python標准庫,本處使用示例如下:
inputstring = u'\n Door:\xa0Novum \t' move = dict.fromkeys((ord(c) for c in u"\xa0\n\t")) output = inputstring.translate(move) output # Door:Novum
利用split
方法
將字符串分割再重組,這時候空白字符就會被pass掉了,不過該方法殺傷力太大,會導致所有空白消失,一定要慎用。
使用示例:
s = 'T-shirt\xa0\xa0短袖圓領衫,\u3000體恤衫\xa0買一件\t吧' ''.join(s.split()) # T-shirt短袖圓領衫,體恤衫買一件吧
使用unicodedata
模塊
Python標准庫的unicodedata
模塊提供了normalize
方法將Unicode字符轉換為正常字符,該方法可算是處理這類情況最好的方法了,它會讓字符回歸到我們期望看到的樣子,同時不損害其它正常的空白字符,而且還能還原其它非空白字符。normalize
第一個參數指定字符串標准化的方式。 NFC
表示字符應該是整體組成(比如可能的話就使用單一編碼),而NFD
表示字符應該分解為多個組合字符表示。Python
同樣支持擴展的標准化形式NFKC
和NFKD
,它們在處理某些字符的時候增加了額外的兼容特性。使用該方法處理\xa0
等字符的示例如下:
import unicodedata s = 'T-shirt\xa0\xa0短袖圓領衫,\u3000體恤衫\xa0買一件\t吧' unicodedata.normalize('NFKC', s) # T-shirt 短袖圓領衫, 體恤衫 買一件 吧