python正则表达式从页面中获取令牌



我正在尝试在Python中自动化一些事情,而不是一次又一次地手动做同样的事情。目前,我在一个名为dnsdumpster.com的网站上找到了"csrfmiddlewaretoken"。我已经为它编写了一个正则表达式,但它返回了包含"csrfMiddlewaretokin"的整个标记。我只对令牌感兴趣(它在HTML标记的"value"参数中(。这是我的代码:

import requests
import re
headers = {
'Host' : 'dnsdumpster.com',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language' : 'en-US,en;q=0.5',
'Accept-Encoding' : 'gzip, deflate',
'DNT' : '1',
'Upgrade-Insecure-Requests' : '1',
'Connection' : 'close'
}
proxies = {
'http' : 'http://127.0.0.1:8080'
}
with requests.Session() as s:
url = 'https://dnsdumpster.com'
response = s.get(url, headers=headers, proxies=proxies)
response.encoding = 'utf-8' # Optional: requests infers this internally
body = response.text
csrfmiddlewaretoken = re.search('name="csrfmiddlewaretoken" value="[0-9a-zA-z]+', body)
print(csrfmiddlewaretoken)
# Embarassing way of getting the token
print(body[2417:2481])

我需要正则表达式的帮助才能单独获得标记值。

您可以通过添加括号在正则表达式中使用捕获组

match = re.search('name="csrfmiddlewaretoken" value="([0-9a-zA-z]+)', body)
if match:
csrfmiddlewaretoken = match.group(1)
else:
# deal with it

风险在于,返回页面中的微小更改可能会破坏您的搜索。XML属性是无序的,页面可以在技术上完全不更改页面的情况下切换它们。

使用漂亮的汤,首选方法:

from bs4 import BeautifulSoup
soup = BeautifulSoup(body, 'html.parser') #body is your response.text or your HTML string
csrf = soup.find("meta",  attrs={'name': "csrfmiddlewaretoken"})
token = csrf["content"] if csrf else None

使用正则表达式:

csrfmiddlewaretoken = re.search('name="csrfmiddlewaretoken" value="[0-9a-zA-z]+', body)
token = None
if csrfmiddlewaretoken:
token = csrfmiddlewaretoken.group().split(' value="')[-1]

在这两种方法中,token变量将包含带有name=csrfmiddlewaretokenmeta标记的值。。。

最新更新