Python爬虫处理\xa0、\u3000、\u2002、\u2003等空格

news/2024/10/29 2:30:02/

Python爬虫处理\xa0、\u3000、\u2002、\u2003等空格

    • 导读
    • 空格类型
    • 普通半角空格
    • 普通全角空格(\u3000)
    • html实体不间断空格(\xa0)
    • html实体半角空格(\u2002)
    • html实体全角空格(\u2003)
    • 统一处理方式

导读

      在爬取网页时,对网页数据清洗时常会遇到空格,有的网页空格类型还不止一种,如果不能正确处理,可能无法提取到需要的数据。这里记录下自己使用正则处理各种类型空格的经历。

空格类型

       这里把空格格式分两类,一类这里表述为普通文本空格,另一类表述为html实体空格。普通文本空格介绍普通半角空格普通全角空格。html实体空格介绍三种,分别为html实体不间断空格 )、html实体半角空格( )和html实体全角空格( )。

  1. 普通半角空格:英文空格键。这是最常见的空格,如我们写代码时,按下空格键产生的就是这种空格键。正则里直接使用空格或者\s就能匹配,在python中对应的unicode码为\u0020;
  2. 普通全角空格:中文空格键。中文网页上常会出现,直接使用正则的\s匹配不到,unicode码为\u3000;
  3. html实体不间断空格:html中的常用空格,出现在html中为&nbsp。网页上看不到,打开浏览器开发工具可以看到,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(ur'i\u0020py', s)  # 用unicode码

执行结果如下
在这里插入图片描述

普通全角空格(\u3000)

该链接导航栏各栏目之间有空格(这个就是\u3000类型的,但是直接看不出来,代码抓取下来可以看到),如下图所示
在这里插入图片描述
以下使用代码获取该段文本,并使用正则提取

import refrom requests import get
from lxml import etreeurl = 'http://hebng.hljcourt.gov.cn/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 = resp.content.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(ur'法院概况 新闻中心', text)  # 匹配不到
print re.findall(ur'法院概况\s新闻中心', text)  # 匹配不到
print re.findall(ur'法院概况\u3000新闻中心', text)  # 这样才可以匹配到
print '=' * 50

执行结果如下
在这里插入图片描述
从以上图片可以看到该网页导航栏各栏目之间的空格就是这种\u3000这种空格,这种类型空格要匹配的话需要在正则表达式中使用unicode码。

html实体不间断空格(\xa0)

该链接正文之间有很多不间断空格,打开开发者工具可以直接看到
在这里插入图片描述
以下使用代码获取该段文本,并使用正则提取

import refrom requests import get
from lxml import etreeurl = 'http://sthj.tj.gov.cn/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 = resp.content.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(ur'\s\s申请行政复议', text)  # 普通半角接普通半角匹配不到
print re.findall(ur'\xa0\s申请行政复议', text)  # 不间断空格接普通半角空格可以匹配到
print re.findall(ur'\u00A0\s申请行政复议', text)  # 不间断空格接普通半角空格可以匹配到
print '=' * 200

执行结果如下
在这里插入图片描述
从以上图片结果可以看出,使用正则匹配非间断空格时,需要使用unicode码\u00A0或者十六进制\xa0。

html实体半角空格(\u2002)

该链接正文末尾的日期前面有很多**&ensp**这种空格,打开开发者工具可以直接看到
在这里插入图片描述
以下使用代码获取该段文本,并使用正则提取

import refrom requests import get
from lxml import etreeurl = 'http://sthj.tj.gov.cn/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 = resp.content.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(ur'\s20', text)  # 普通半角匹配不到
print re.findall(ur'\u200220', text)  # unicode码\u2002可以匹配到
print '=' * 200

执行结果如下
在这里插入图片描述
从以上图片结果可以看出,使用正则匹配html实体半角空格时,需要使用unicode码\u2002。

html实体全角空格(\u2003)

该链接正文表格表头有一列中有该类型空格, ,如下图所示
在这里插入图片描述
以下使用代码获取该段文本,并使用正则提取

import refrom requests import get
from lxml import etreeurl = 'http://hebng.hljcourt.gov.cn/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 = resp.content.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(ur'\t\s\r', text_list[0])  # 普通半角匹配不到
print re.findall(ur'\t\u2003\r', text_list[0], flags=re.S)  # unicode码\u2003可以匹配到
print '=' * 200

执行结果如下
在这里插入图片描述
从以上结果看出,使用正则匹配html实体半角空格时,需要使用unicode码\u2003。

统一处理方式

从以上几个例子可以看出,网页上的空格类型要想处理好,是要兼顾几种情况的,其实爬虫主要遇到的就是\xa0、\u3000这两种。可以使用统一正则匹配,如下测试代码

import res = u'\u2002\u2003\xa0\u3000Say'print len(s)
print s
print re.findall(r'\s{4}Say', s)  # 普通空格匹配不到
print re.findall(ur'[\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字符的网站unicode-table,可以在html实体这里看到有许多html中不同类型的空格。


http://www.ppmy.cn/news/520066.html

相关文章

在Ubuntu下安装jdk解压出现问题:./jdk-6u30-linux-i586.bin: 113: ./install.sfx.3631: not found

在Ubuntu下安装jdk解压出现问题:./jdk-6u30-linux-i586.bin: 113: ./install.sfx.3631: not found。 Failed to extract the files. Please refer to the Troubleshooting section of the Installation Instructions on the download page for more information 网…

python中前缀u_Python字符串前缀u、r、b、f含义

1、字符串前加 u 例子: u"字符串中有中文" 含义: 前缀u表示该字符串是unicode编码,Python2中用,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码。另外一般要在文件开关标明编码方式采用utf8。 Python3中,所有字符串默认都是unicode字符串。 2…

Ubuntu11.10下安装 jdk-6u30-linux-i586.bin[转]

JDK:Linux X86下SUN公司的 jdk-6u30-linux-i586.bin 下载JDK。下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u30-download-1377139.html ,选择Linux X86下的 jdk-6u30-linux-i586.bin. 首先把JDK拷贝到指定的目录&#xff…

Serv-U 15.1.2安装使用

Serv_U软件下载 安装文件:SU-FTP-Server-Windows-v15.1.2 注册文件:Patcher v2.3.1 for Serv-U v15.x.x.x 百度云盘链接: 链接:https://pan.baidu.com/s/1Poyh80oTxhJ3znZ3ZnZn4Q 提取码:rx30 安装步骤 安装过程 …

工行u盾显示316_工行U盾常见故障处理

一、常见故障现象 U盾连接电脑后,指示灯不闪烁 系统无法识别U盾 系统将U盾识别为“未知设备” U盾管理工具中显示U盾工作状态不正常、不工作 使用管理工具无法看到证书信息 出现错误信息“Reader PCSC Driver Error” 管理工具显示介面为英文 IE中无法看到证书信息 重启机器后…

atv320说明书_ATV320U30N4B 施耐德 ATV320通用变频器 说明书

上海先韵自动化科技有限公司 Shanghai Xianyun Automation Technology Co., Ltd. ATV320U30N4B 施耐德 ATV320通用变频器 上海先韵自动化专注于进口品牌工业自动化产品销售、非标自动化设备零部件供应 和专业技术服务于一体的高新技术企业。 通用变频器在工业领域的应用为企业大…

Python: 'gbk' codec can't encode character '\u30fb' in position 0: illegal multibyte sequence

先上代码: 代码是通过爬去王者荣耀官方网站的数据,然后再写入文件中,获取的英雄,铭文等信息写入时都没有问题,但是写入装备信息时就出现编码的问题了 # -*- coding: utf-8 -*- """ Created on Thu Nov…

'gbk' codec can't encode character '\u30fb' in position *: illegal multibyte sequence

写文件时编码错误 在open()方法中添加encodingutf-8可解决。