最近在爬取今日头条时 出现了正则无法正确匹配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解码 但会导致其他部分乱码