您现在的位置是:首页 > 文章详情

Python-网页转义字符及正则全文匹配

日期:2018-07-12点击:288

前言

大部分情况下,通过request去请求网页,response.text返回来的都是正常值,但是有一些反爬虫比较严重的网站(比如知乎)就不会是这样。知乎会返回转义字符,例如:

 header = { "User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0", "HOST":"www.zhihu.com", "Referer":"https://www.zhihu.com/signup?next=%2F", } def rget(): response = session.get("https://www.zhihu.com/signup?next=%2F", headers=header) target_str = response.text print(target_str) rget() 

在给知乎的登录页面发请求后,打印返回结果(内容太多,只返回一小部分):

"token":{"xsrf":"9b6c6406-db1b-45fa-8626-296c037cfc00","xUDID":"ANBsasFlAg2PTgaqB1CHBtsWMijmJ20s89E="},"account":{"lockLevel":{} 

发现有很多字符是转义的,登录需要用到的xsrf字段也在这里面,这样做正则匹配就很麻烦。

解决的办法是将html进行转义:

import html target_str = html.unescape(response.text) 

就能够得到正常的返回信息了:

"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="}, 

正则匹配

匹配xsrf的值 (为了方便测试,只将一小部分值提取出来做匹配):

tokens = '"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:' matchs = re.search(r'xsrf[:"\w-]+', tokens) if matchs: print(matchs.group(0)) else: print("未匹配") 

得到输出结果为:

xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920" 

然后再借用replace将引号替换,然后用split将值用冒号分开:

import re tokens = '"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:' matchs = re.search(r'xsrf[:"\w-]+', tokens) nstr = matchs.group(0).replace("\"", "").split(":") finall = nstr[1] print(finall) 

就得到了我需要的xsrf:

9febf0fd-7c47-4695-93b6-f670e518d920 

xUDID的提取也是如此,这两个值在知乎登录的时候是需要携带的,所以要提取:

import re tokens = '"token":{"xsrf":"9febf0fd-7c47-4695-93b6-f670e518d920","xUDID":"ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc="},:' matchs = re.search(r'xUDID[:"\w-]+=', tokens) nstr = matchs.group(0).replace("\"", "").split(":") finall = nstr[1] print(finall) 
ACDsF5lmAg2PTi2GMwQTl0Cwh88G51BOgzc= 

re正则匹配html的坑

上面的正则可以匹配到字符串了,如果正常登录的话要将请求返回的内容文本进行匹配的,也就是匹配response.text,代码是否就是

matchs = re.search(r'xUDID[:"\w-]+=', response.text) 

坑就在这里!

re默认匹配的是单行字符串,而response.text的返回值虽然是一个html页面的构成,但是它是分行的,第一行是html头<! DOCUMENT html>不是我想要的整个文本进行匹配。

re是支持整个文本匹配的,需要在正则代码加上参数re.DOTALL即可:

matchs = re.search(r'xUDID[:"\w-]+=', response.text, re.DOTALL) 

就可以对整个返回的文本进行匹配了

原文链接:https://yq.aliyun.com/articles/629295
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章