Python爬⾍处理xa0、u3000、u2002、u2003等空格
Python爬⾍处理\xa0、\u3000、\u2002、\u2003等空格
导读
在爬取⽹页时,对⽹页数据清洗时常会遇到空格,有的⽹页空格类型还不⽌⼀种,如果不能正确处理,可能⽆法提取到需要的数据。这⾥记录下⾃⼰使⽤正则处理各种类型空格的经历。
空格类型
这⾥把空格格式分两类,⼀类这⾥表述为普通⽂本空格,另⼀类表述为html实体空格。普通⽂本空格介绍普通半⾓空格和普通全⾓空格。html实体空格介绍三种,分别为html实体不间断空格( )、html实体半⾓空格( )和html实体全⾓空格( )。
1. 普通半⾓空格:英⽂空格键。这是最常见的空格,如我们写代码时,按下空格键产⽣的就是这种空格键。正则⾥直接使⽤空格或者\s
unicode在线工具
就能匹配,在python中对应的unicode码为\u0020;
2. 普通全⾓空格:中⽂空格键。中⽂⽹页上常会出现,直接使⽤正则的\s匹配不到,unicode码为\u3000;
3. html实体不间断空格:html中的常⽤空格,出现在html中为 。⽹页上看不到,打开浏览器开发⼯具可以看到,unicode码为
\u00A0,对应的⼗六进制为\xa0;
4. html实体半⾓空格:&ensp,unicode码为\u2002;
5. html实体全⾓空格:&emsp,unicode码为\u2003;
普通半⾓空格
这种空格不需要特殊处理,使⽤正则匹配,可以直接使⽤空格或者\s。为了以下铺垫,这⾥也举个⽤unicode码匹配该类型空格的例⼦,代码如下所⽰
s ='hello word, hi python'
print re.findall(r'i py', s)# 直接⽤空格
print re.findall(r'i\spy', s)# ⽤\s
print re.findall(u r'i\u0020py', s)# ⽤unicode码
执⾏结果如下
普通全⾓空格(\u3000)
导航栏各栏⽬之间有空格(这个就是\u3000类型的,但是直接看不出来,代码抓取下来可以看到),如下图所⽰
以下使⽤代码获取该段⽂本,并使⽤正则提取
url ='v/public/detail.php?id=1818'
headers ={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
resp = get(url, headers=headers)
html = t.decode('gbk')
et = etree.HTML(html)
text_list = et.xpath('/html/body/table[3]/tr[2]//text()')
text = et.xpath('string(/html/body/table[3]/tr[2])')
print'='*50
print re.findall(u r'法院概况新闻中⼼', text)# 匹配不到
print re.findall(u r'法院概况\s新闻中⼼', text)# 匹配不到
print re.findall(u r'法院概况\u3000新闻中⼼', text)# 这样才可以匹配到
print'='*50
执⾏结果如下
从以上图⽚可以看到该⽹页导航栏各栏⽬之间的空格就是这种\u3000这种空格,这种类型空格要匹配的话需要在正则表达式中使⽤unicode码。
html实体不间断空格(\xa0)
正⽂之间有很多不间断空格,打开开发者⼯具可以直接看到
以下使⽤代码获取该段⽂本,并使⽤正则提取
import re
from requests import get
from lxml import etree
url ='v/ZWGK4828/ZFXXGK8438/FDZDGK27/XZCFQZXZCFXX7581/202010/t20201020_3958760.html'
headers ={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/
79.0'}
resp = get(url, headers=headers)
html = t.decode('utf-8')
et = etree.HTML(html)
text_list = et.xpath('//*[@id="zoom"]/p[30]/text()')
text = et.xpath('string(//*[@id="zoom"]/p[30])')# 注意申请⾏政复议前⾯有四个空格,其中三个不间断空格,⼀个普通半⾓空格
print'='*200
print re.findall(u r'\s\s申请⾏政复议', text)# 普通半⾓接普通半⾓匹配不到
print re.findall(u r'\xa0\s申请⾏政复议', text)# 不间断空格接普通半⾓空格可以匹配到
print re.findall(u r'\u00A0\s申请⾏政复议', text)# 不间断空格接普通半⾓空格可以匹配到
print'='*200
执⾏结果如下
从以上图⽚结果可以看出,使⽤正则匹配⾮间断空格时,需要使⽤unicode码\u00A0或者⼗六进制\xa0。
html实体半⾓空格(\u2002)
正⽂末尾的⽇期前⾯有很多**&ensp**这种空格,打开开发者⼯具可以直接看到
以下使⽤代码获取该段⽂本,并使⽤正则提取
url ='v/ZWGK4828/ZFXXGK8438/FDZDGK27/XZCFQZXZCFXX7581/202112/t20211207_5743296.html'
headers ={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
resp = get(url, headers=headers)
html = t.decode('utf-8')
et = etree.HTML(html)
text_list = et.xpath('//*[@id="zoom"]/div/p[38]/span[1]/text()')
text = et.xpath('string(//*[@id="zoom"]/div/p[38]/span[1])')
print'='*200
print re.findall(u r'\s20', text)# 普通半⾓匹配不到
print re.findall(u r'\u200220', text)# unicode码\u2002可以匹配到
print'='*200
执⾏结果如下
从以上图⽚结果可以看出,使⽤正则匹配html实体半⾓空格时,需要使⽤unicode码\u2002。
html实体全⾓空格(\u2003)
正⽂表格表头有⼀列中有该类型空格, ,如下图所⽰
以下使⽤代码获取该段⽂本,并使⽤正则提取
import re
from requests import get
from lxml import etree
url ='v/public/detail.php?id=1818'
headers ={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
resp = get(url, headers=headers)
html = t.decode('gbk')
et = etree.HTML(html)
text_list = et.xpath('//table[@class="ke-zeroborder"]/tbody/tr[1]/td[1]/text()')
text = et.xpath('string(table[@class="ke-zeroborder"]/tbody/tr[1]/td[1])')
print'='*200
print re.findall(u r'\t\s\r', text_list[0])# 普通半⾓匹配不到
print re.findall(u r'\t\u2003\r', text_list[0], flags=re.S)# unicode码\u2003可以匹配到
print'='*200
执⾏结果如下
从以上结果看出,使⽤正则匹配html实体半⾓空格时,需要使⽤unicode码\u2003。
统⼀处理⽅式
从以上⼏个例⼦可以看出,⽹页上的空格类型要想处理好,是要兼顾⼏种情况的,其实爬⾍主要遇到的就是\xa0、\u3000这两种。可以使⽤统⼀正则匹配,如下测试代码
s =u'\u2002\u2003\xa0\u3000Say'
print len(s)
print s
print re.findall(r'\s{4}Say', s)# 普通空格匹配不到
print re.findall(u r'[\u2002\u2003\xa0\u3000]{4}Say', s)# 使⽤unicode码可以匹配到
print re.findall(r'\s{4}Say', s, flags=re.U)# 使⽤re.U模式可以匹配到
代码执⾏结果如下
注意看以上结果,这⾥的s是unicode字符串,共7个字符,其中四个不同类型的空格,使⽤对应的unicode码可以匹配到这些空格。要注意下当正则模式的编译标志位(flags)为re.U时,使⽤正则符号\s是可以匹配到各种类型的空格的。
最后安利⼀个查unicode字符的⽹站,可以在这⾥看到有许多html中不同类型的空格。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。