首页 > 解决方案 > python正则表达式从页面获取令牌

问题描述

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

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])

我需要正则表达式的帮助才能单独获取令牌值。

标签: pythonre

解决方案


使用美汤,首选方法:

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变量都将包含meta带有name=csrfmiddlewaretoken...


推荐阅读