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

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

作者: 中乘风 | 来源:发表于2018-07-13 16:34 被阅读0次

前言

大部分情况下,通过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)

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

相关文章

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

    前言 大部分情况下,通过request去请求网页,response.text返回来的都是正常值,但是有一些反爬虫比...

  • 正则表达式

    1.常用正则匹配符号 1.字符:匹配单个字符 a:表示匹配字符a; \:匹配转义字符

  • 正则匹配

    正则匹配 一.常用符号 转义字符\ (******)在正则中有特殊意义的符号通过转义字符转义,就会变成普通的符号e...

  • 正则表达式

    创建正则表达式 正则.test(字符串) 正则去匹配字符串,如果匹配成功就返回真,如果匹配失败就返回假 转义字符 ...

  • 正则表达式

    创建正则表达式 正则.test(字符串) 正则去匹配字符串,如果匹配成功就返回真,如果匹配失败就返回假 转义字符 ...

  • 正则

    正则的方法test:正则去匹配字符串,如果匹配成功为true,失败返回false 转义字符:\s :空格\S :非...

  • 正则表达式用法记录

    正则是干什么的 正则是一种规则,用来匹配和捕获字符串的规则。 正则的规则 元字符 反义字符 转义字符 重复匹配 分...

  • post请求、正则

    发起post请求 正则 多字符匹配. :表示匹配除了换行符以外的任意字符\ :转义字符【a-z】:匹配a到z中任意...

  • JavaScript正则表达式——转义字符

    1、转义:JavaScript正则表达式也支持非字母的字符匹配,这些字符需要通过反斜杠(\)进行转义总结1、\n:...

  • 常用的正则表达式

    微软-正则表达式语法菜鸟教程-正则 特殊字符 若要匹配这些特殊字符之一,必须首先转义字符,即,在字符前面加反斜杠字...

网友评论

      本文标题:Python-网页转义字符及正则全文匹配

      本文链接:https://www.haomeiwen.com/subject/aphspftx.html