無(wú)法訪(fǎng)問(wèn)的網(wǎng)站或無(wú)效的招標(biāo)網(wǎng)站 ..."/>
您好,登錄后才能下訂單哦!
今天遇到一個(gè)問(wèn)題,使用python的find函數(shù)尋找字符串中的第一個(gè)空格時(shí)沒(méi)有找到正確的位置,例如:
http://zc.whmc.edu.cn ==> 無(wú)法訪(fǎng)問(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è)紅線(xiàn)上方有一個(gè)白點(diǎn),而第一個(gè)紅線(xiàn)上方卻沒(méi)有,這說(shuō)明第一個(gè)紅線(xiàn)上方那個(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)文章希望大家以后多多支持億速云!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。