Python 字符串處理特殊空格\xc2\xa0\t\n Non-breaking space
今天遇到一個(gè)問(wèn)題,使用python的find函數(shù)尋找字符串中的第一個(gè)空格時(shí)沒(méi)有找到正確的位置,例如:
http://zc.whmc.edu.cn ==> 無(wú)法訪問(wèn)的網(wǎng)站或無(wú)效的招標(biāo)網(wǎng)站

使用find(" ")函數(shù)尋找時(shí)找到的第一個(gè)空格對(duì)應(yīng)在==>后面的那個(gè)位置。一開(kāi)始覺(jué)得是編碼問(wèn)題,但是文件是用UTF-8編碼的,按理說(shuō)不應(yīng)該產(chǎn)生編碼問(wèn)題,就用Sublime打開(kāi)一看是這樣的:
可以看到,我的Sublime設(shè)置了顯示空白,所以第二個(gè)紅線上方有一個(gè)白點(diǎn),而第一個(gè)紅線上方卻沒(méi)有,這說(shuō)明第一個(gè)紅線上方那個(gè)字符確實(shí)不是一個(gè)空格,也就是說(shuō)函數(shù)的運(yùn)行沒(méi)有問(wèn)題。但那個(gè)空格倒底是個(gè)什么東西呢?在Sublime中File-->Reopen with Encoding-->Hexadecimal打開(kāi)文件可以看到是這樣的:

在網(wǎng)上可以查到,==>對(duì)應(yīng)的UTF-8編碼是\x3d\x3d\x3e,所以前面的那個(gè)神秘字符的編碼就是\xc2\xa0,上網(wǎng)查到這是一個(gè)叫做Non-breaking space的東西,用于阻止在此處自動(dòng)換行和阻止多個(gè)空格被壓縮成一個(gè)。至于解決方法,先用subplace("\xc2\xa0", " ")把這個(gè)特殊的空格替換一下就行了。
去除特殊空格:\xc2\xa0
在去除空格的時(shí)候遇到一種情況:
a = '2 ' b = '3' print a.split(),b
輸出結(jié)果:
['2\xc2\xa0'] 3
在網(wǎng)上可以查到,==>對(duì)應(yīng)的UTF-8編碼是\x3d\x3d\x3e,所以前面的那個(gè)神秘字符的編碼就是\xc2\xa0,上網(wǎng)查到這是一個(gè)叫做Non-breaking space的東西,用于阻止在此處自動(dòng)換行和阻止多個(gè)空格被壓縮成一個(gè)。至于解決方法,先用subplace("\xc2\xa0", " ")
a = '2 '
b = '3'
print a.replace("\xc2\xa0", ""),b
輸出結(jié)果:

python 爬蟲(chóng)爬取內(nèi)容時(shí), \xa0 、 \u3000 的含義與處理方法
處理方法
str.replace(u'\xa0', u' ')
最近用 scrapy 爬某網(wǎng)站,發(fā)現(xiàn)拿到的內(nèi)容里面含有 \xa0 、 \u3000 這樣的字符,起初還以為是編碼不對(duì),搜了一下才知道是見(jiàn)識(shí)太少 233 。
\xa0 是不間斷空白符
我們通常所用的空格是 \x20 ,是在標(biāo)準(zhǔn)ASCII可見(jiàn)字符 0x20~0x7e 范圍內(nèi)。
而 \xa0 屬于 latin1 (ISO/IEC_8859-1)中的擴(kuò)展字符集字符,代表空白符nbsp(non-breaking space)。
latin1 字符集向下兼容 ASCII ( 0x20~0x7e )。通常我們見(jiàn)到的字符多數(shù)是 latin1 的,比如在 MySQL 數(shù)據(jù)庫(kù)中。
這里也有一張簡(jiǎn)陋的Latin1字符集對(duì)照表。
\u3000 是全角的空白符
根據(jù)Unicode編碼標(biāo)準(zhǔn)及其基本多語(yǔ)言面的定義, \u3000 屬于CJK字符的CJK標(biāo)點(diǎn)符號(hào)區(qū)塊內(nèi),是空白字符之一。它的名字是 Ideographic Space ,有人譯作表意字空格、象形字空格等。顧名思義,就是全角的 CJK 空格。它跟 nbsp 不一樣,是可以被換行間斷的。常用于制造縮進(jìn), wiki 還說(shuō)用于抬頭,但沒(méi)見(jiàn)過(guò)。
這里還有一個(gè) Unicode.org 上關(guān)于 CJK 標(biāo)點(diǎn)符號(hào)塊的字符代碼表。
python中去掉字符串中的\xa0、\t、\n
今天幫女朋友從網(wǎng)絡(luò)上收集一些信息,但是發(fā)現(xiàn)提取出的信息中有“\xa0”,并且無(wú)法去掉,查閱了相關(guān)資料,后發(fā)現(xiàn)該字符表示空格。
\xa0 是不間斷空白符
我們通常所用的空格是 \x20 ,是在標(biāo)準(zhǔn)ASCII可見(jiàn)字符 0x20~0x7e 范圍內(nèi)。
而 \xa0 屬于 latin1 (ISO/IEC_8859-1)中的擴(kuò)展字符集字符,代表空白符nbsp(non-breaking space)。
latin1 字符集向下兼容 ASCII ( 0x20~0x7e )。通常我們見(jiàn)到的字符多數(shù)是 latin1 的,比如在 MySQL 數(shù)據(jù)庫(kù)中。
有如下信息:
'T-shirt\xa0\xa0短袖圓領(lǐng)衫,體恤衫\xa0,', 'V-neck\xa0\xa0V型領(lǐng)\xa0sleeve\xa0\xa0袖子\xa0,',
我們?nèi)绾螌⑵渲械腬xz0去掉呢,試了re模塊的sub方法,發(fā)現(xiàn)沒(méi)有作用,于是又開(kāi)始查閱相關(guān)資料,終于解決了該問(wèn)題。方法如下:
>>> 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
另外還有一種更簡(jiǎn)單的方法,利用split方法:
>>> s 'T-shirt\xa0\xa0短袖圓領(lǐng)衫,體恤衫\xa0' >>> out = "".join(s.split()) >>> out 'T-shirt短袖圓領(lǐng)衫,體恤衫'
可以發(fā)現(xiàn)利用translate方法、split()可以完美解決,并且還可以替換\t \n字符,由此又學(xué)到了新知識(shí)!
關(guān)于ord函數(shù):
ord()函數(shù)是chr()函數(shù)(對(duì)于8位的ASCII字符串)或unichr()函數(shù)(對(duì)于Unicode對(duì)象)的配對(duì)函數(shù),它以一個(gè)字符(長(zhǎng)度為1的字符串)作為參數(shù),返回對(duì)應(yīng)的ASCII數(shù)值,或者Unicode數(shù)值,如果所給的Unicode字符超出了你的Python定義范圍,則會(huì)引發(fā)一個(gè)TypeError的異常。
關(guān)于fromkeys方法:
dict中的fromkeys方法目的是創(chuàng)建一個(gè)只有key的字典,內(nèi)部利用for循環(huán),使三個(gè)字符的asii碼值成為可迭代對(duì)象(本來(lái)的整數(shù)是不可迭代的),分別對(duì)其迭代,存入字典。
關(guān)于translate方法:
Python translate() 方法根據(jù)參數(shù)table給出的表(包含 256 個(gè)字符)轉(zhuǎn)換字符串的字符, 要過(guò)濾掉的字符放到 del 參數(shù)中。接收到move返回的表(字典),之后對(duì)字符串進(jìn)行替換。
join()方法:
join(): 連接字符串?dāng)?shù)組。將字符串、元組、列表中的元素以指定的字符(分隔符)連接生成一個(gè)新的字符串??梢?jiàn)該處用join方法真的是神來(lái)之筆,可謂絕妙!
值得注意的是,split方法中不帶參數(shù)時(shí),表示分割所有換行符、制表符、空格。
python2 可以這樣
s=s.replace(unichr(0xa0),'')
到此這篇關(guān)于Python 字符串處理特殊空格\xc2\xa0 Non-breaking space的文章就介紹到這了,更多相關(guān)Python 特殊空格內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python自動(dòng)化測(cè)試工具Splinter簡(jiǎn)介和使用實(shí)例
這篇文章主要介紹了Python自動(dòng)化測(cè)試工具Splinter簡(jiǎn)介和使用實(shí)例,Splinter可以非常棒的模擬瀏覽器的行為,Splinter提供了豐富的API,可以獲取頁(yè)面的信息判斷當(dāng)前的行為所產(chǎn)生的結(jié)果2014-05-05
Python使用正則表達(dá)式報(bào)錯(cuò):nothing?to?repeat?at?position?0的解決方案
今天在使用python 正則模塊匹配字符串時(shí)遇到了這個(gè)問(wèn)題,分享給大家,這篇文章主要給大家介紹了關(guān)于Python使用正則表達(dá)式報(bào)錯(cuò)nothing?to?repeat?at?position?0的解決方案,需要的朋友可以參考下2023-03-03
OpenCV+python手勢(shì)識(shí)別框架和實(shí)例講解
今天小編就為大家分享一篇OpenCV+python手勢(shì)識(shí)別框架和實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
OpenCV-Python實(shí)現(xiàn)輪廓檢測(cè)實(shí)例分析
這篇文章主要介紹了OpenCV-Python實(shí)現(xiàn)輪廓檢測(cè)實(shí)例分析,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
詳解tensorflow載入數(shù)據(jù)的三種方式
這篇文章主要介紹了詳解tensorflow載入數(shù)據(jù)的三種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python中內(nèi)存管理機(jī)制與優(yōu)化技巧分享
這篇文章主要來(lái)和大家簡(jiǎn)單聊一聊Python中的內(nèi)存管理,從而可以幫助大家寫出更高效,優(yōu)化內(nèi)存占用的 Python 代碼,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
python修改注冊(cè)表終止360進(jìn)程實(shí)例
這篇文章主要介紹了python修改注冊(cè)表終止360進(jìn)程實(shí)例,是非常實(shí)用的進(jìn)程操作技巧,需要的朋友可以參考下2014-10-10
樹(shù)莓派中python獲取GY-85九軸模塊信息示例
本文內(nèi)容是樹(shù)莓派中python獲取GY-85九軸模塊信息的示例,這里使用Python的curses包開(kāi)發(fā)cli窗口程序,用來(lái)實(shí)時(shí)刷新傳感器的讀數(shù),下面看代碼2013-12-12

