关于爬虫时网页中含unicode编码导致正则无法正确匹配的问题

最近在爬取今日头条时 出现了正则无法正确匹配url问题 不使用’unicode-escape’方法下 现已解决 希望能帮助各位小伙伴
欲匹配的url如图

在这里插入图片描述

开始我使用的正则格式为


import re

headers = {

    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

                  'Chrome/80.0.3987.149 Safari/537.36',

    'cookie': 'tt_webid=6806572343562094094; s_v_web_id=verify_k81ca1w0_vh0EbTyr_HS3Y_4PFK_Bwq2_DOrKyvhp5uMN; '

              'WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6806572343562094094; '

              'ttcid=43d91974d34a42df9358bcc4fb4a0c2834; csrftoken=444cb50514011fb72cca45e815aaa808; '

              'UM_distinctid=170fc2b546d409-074b4e2fd4738a-f313f6d-144000-170fc2b546ebd2; '

              'CNZZDATA1259612802=591899891-1584774793-https%253A%252F%252Fwww.toutiao.com%252F%7C1584774793; '

              '_ga=GA1.2.958742555.1584778663; SLARDAR_WEB_ID=38abe9ce-6f79-4e00-bb3f-e707bb7634f4; '

              'RT="z=1&dm=toutiao.com&si=4nvgi31t4wg&ss=k8lf382q&sl=1&tt=0&nu=f37766b0d023dcda3973b7fcbf2cba56&cl'

              '=d6t6&obo=1&ld=dd1u&r=4d707aab8209c38c1dfc5a11a3ddf8e5&ul=dd1x&hd=dd3r"; '

              '__tasessionId=npao9b1fx1586248375779; '

              'tt_scid=T3Kp0Z-NOCOt3q3JSm8Ss13n.KoME8zuZ3-6JZir9qD5qJICh.OGaUd0f72JWnSY4d75 '

}



def get_detail(url):#函数得源码

    response = requests.get(url, headers=headers)

    if response.status_code == 200:

        return response.text


def main():

    url = "https://www.toutiao.com/a6795524234970923531/"#传入url  今日头条界面

    html = get_detail(url)#得到源码

    print(html)

    images_pattern = re.compile("(http:\u002F\u002Fp\\w.pstatp.com\u002Flarge\u002Fpgc-image\u002F.*?)\", re.S)

    x = re.findall(images_pattern, html)#匹配

    print(x)#打印


#主函数

if __name__ == '__main__':

    main()

但匹配为空
但打印出来结果却能用正则正确匹配
查阅大量资料 问了一些前辈 给出的解决方法为
改为 response.content.decode("unicode-escape)

试验后 可行 但匹配的其他信息为乱码

今天突然想到另一种解决方法
将正则改为

images_pattern = re.compile("(http:\\\\u002F\\\\u002Fp\\w.pstatp.com\\\\u002Flarge\\\\u002Fpgc-image\\\\u002F.*?)\", re.S)

转义正则表达式

ps:开始匹配不到的原因为
响应信息以utf-8解码后
里面的内容含有unicode编码
而我最开始的正则中含有的\u002F实际上也就是’/’ 而text文件中为‘\u002F’
二者根本不匹配 所以导致匹配失败!

大家可以仔细研究下‘unicode-escape’编码原理

a = "袁凤珍"
b = a.encode('unicode-escape')
print(b)
c = b.decode('utf-8')
print(c)

结果为

>b'\\u8881\\u51e4\\u73cd'
>\u8881\u51e4\u73cd

说明 文字在经unicode-escape编码后经utf-8解码 出现unicode码点
这是网页中出现\u002F的原因
所以也可以用unicode-escape解码 但会导致其他部分乱码

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值