如何将 requests.RequestsCookieJar 转换为字符串

hgm*_*inh 8 python python-requests

我有一个requests.RequestCookieJar包含来自不同域/路径的多个 cookie的对象。如何按照此处提到的规则为特定域/路径提取 cookie 字符串?

例如

>>> r = requests.get("https://stackoverflow.com")
>>> print(r.cookies)
<RequestsCookieJar[<Cookie prov=4df137f9-848e-01c3-f01b-35ec61022540 for .stackoverflow.com/>]>

# the function I expect
>>> getCookies(r.cookies, "stackoverflow.com")
"prov=4df137f9-848e-01c3-f01b-35ec61022540"

>>> getCookies(r.cookies, "meta.stackoverflow.com")
"prov=4df137f9-848e-01c3-f01b-35ec61022540"
# meta.stackoverflow.com is also satisfied as it is subdomain of .stackoverflow.com

>>> getCookies(r.cookies, "google.com")
""
# r.cookies does not contains any cookie for google.com, so it return empty string
Run Code Online (Sandbox Code Playgroud)

nof*_*tor 5

我认为你需要使用 cookie 的 Python 字典。(请参阅我上面的评论。)

def getCookies(cookie_jar, domain):
    cookie_dict = cookie_jar.get_dict(domain=domain)
    found = ['%s=%s' % (name, value) for (name, value) in cookie_dict.items()]
    return ';'.join(found)
Run Code Online (Sandbox Code Playgroud)

你的例子:

>>> r = requests.get("https://stackoverflow.com")
>>> getCookies(r.cookies, ".stackoverflow.com")
"prov=4df137f9-848e-01c3-f01b-35ec61022540"
Run Code Online (Sandbox Code Playgroud)


Mon*_*ons 2

新答案

好吧,所以我仍然不明白你想要实现的目标。

如果您想从对象中提取原始 url requests.RequestCookieJar(以便您可以检查是否与给定子域匹配),这是(据我所知)不可能的。

但是,您当然可以这样做:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import requests
import re

class getCookies():

    def __init__(self, url):

        self.cookiejar = requests.get(url).cookies
        self.url = url

    def check_domain(self, domain):

        try:

            base_domain = re.compile("(?<=\.).+\..+$").search(domain).group()

        except AttributeError:

            base_domain = domain

        if base_domain in self.url:

            print("\"prov=" + str(dict(self.cookiejar)["prov"]) + "\"")

        else:

            print("No cookies for " + domain + " in this jar!")
Run Code Online (Sandbox Code Playgroud)

那么如果你这样做:

new_instance = getCookies("https://stackoverflow.com")
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

new_instance.check_domain("meta.stackoverflow.com")
Run Code Online (Sandbox Code Playgroud)

这将给出输出:

"prov=5d4fda78-d042-2ee9-9a85-f507df184094"
Run Code Online (Sandbox Code Playgroud)

尽管:

new_instance.check_domain("google.com")
Run Code Online (Sandbox Code Playgroud)

会输出:

"No cookies for google.com in this jar!"
Run Code Online (Sandbox Code Playgroud)

然后,如果您(如果需要)微调正则表达式并创建一个 url 列表,您可以首先循环该列表以创建许多实例并将它们保存在列表或字典中。在第二个循环中,您可以检查另一个 url 列表,以查看它们的 cookie 是否可能存在于任何实例中。


旧答案

您链接解释的文档:

项目()

类似字典的 items() 从 jar 中返回名称-值元组的列表。允许客户端代码调用 dict(RequestsCookieJar) 并获取键值对的普通 python 字典。

我认为您正在寻找的是:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import requests

def getCookies(url):

    r = requests.get(url)

    print("\"prov=" + str(dict(r.cookies)["prov"]) + "\"")
Run Code Online (Sandbox Code Playgroud)

现在我可以像这样运行它:

>>> getCookies("https://stackoverflow.com")
"prov=f7712c78-b489-ee5f-5e8f-93c85ca06475"
Run Code Online (Sandbox Code Playgroud)