【问题标题】:python regular expression to get a token from the pagepython正则表达式从页面获取令牌
【发布时间】:2020-12-04 06:43:03
【问题描述】:

我试图在 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])

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

【问题讨论】:

  • 我建议使用第三方库来提取这样的内容,而不是构建自己的正则表达式:pypi.org/project/beautifulsoup4
  • 如果您尝试解析 HTML,那么您应该使用 HTML 解析器而不是依赖正则表达式。它有点冗长,但更健壮。 Python 在html.parser 模块中内置了一个简单的解析器,但 BeautifulSoup 很受推崇。

标签: python python-re


【解决方案1】:

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

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

风险在于返回页面中的微小更改可能会破坏您的搜索。 XML 属性是无序的,页面可以切换它们,但从技术上讲仍然根本不改变页面。

【讨论】:

    【解决方案2】:

    用美汤,首选方法:

    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...

    【讨论】:

    • 我收到以下错误:TypeError: find() got multiple values for argument 'name'
    • 对不起,我的错...进行了更改,请立即检查...
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多