Python 正则表达式帮助(httplib2 Cookies)

0 投票
2 回答
1632 浏览
提问于 2025-04-15 19:29

我遇到和这个问题提问者一样的情况:httplib2,如何设置多个cookie?

这个cookie看起来是这样的……

PHPSESSID=8527b5532b6018aec4159d81f69765bd; path=/; expires=Fri, 19-Feb-2010 13:52:51 GMT, id=1578; expires=Mon, 22-Feb-2010 13:37:51 GMT, password=123456; expires=Mon, 22-Feb-2010 13:37:51 GMT, sid=8527b5532b6018aec4159d81f69765bd

注意到它是用逗号和分号来分隔不同的cookie,但逗号在cookie的内容里也会出现。

这让我觉得太复杂了,我写不出一个正则表达式来正确分隔这些cookie。如果有人愿意帮忙写一下,我会非常感激!

2 个回答

1

注意,它使用逗号和分号来分隔 cookies,但在 cookie 本身中也使用了逗号。

正如所引用的,模糊的逗号让这个字符串无法用正则表达式或其他工具解析。这个字符串是从哪里来的呢?

作为一个 Set-Cookie: 头部的值,它完全无效,在任何浏览器中都无法使用。浏览器会把 PHPSESSID 设置为一个会话 cookie(因为过多的逗号导致过期日期格式无效),并忽略其他部分。多个 cookies 必须用多个 Set-Cookie 头部来设置,而不能合并成一个。

编辑:好的,似乎发生的事情是 httplib2 正在使用标准库的 email 包来解析 HTTP 响应数据中的头部。在电子邮件中,RFC822 标准要求多个同名的头部(比如 To: 地址)等同于一个头部,值用逗号连接。

然而,HTTP 响应显然不是 RFC822 标准的一部分;用这种方式处理它们是完全不合适的。看起来,使用 email 来解析 HTTP 响应,让 httplib2 无法正确处理任何重复使用的头部,而 Set-Cookie 头部经常就是这样使用的。因此,我认为 httplib2 根本上是有问题的,建议不要使用它。

1

你有没有试过 cookielib 或者 http.cookiejar 呢?


如果你把 cookie 理解成这样

PHPSESSID=8527b5532b6018aec4159d81f69765bd;
path=/;
expires=Fri, 19-Feb-2010 13:52:51 GMT, id=1578;
expires=Mon, 22-Feb-2010 13:37:51 GMT, password=123456; 
expires=Mon, 22-Feb-2010 13:37:51 GMT, sid=8527b5532b6018aec4159d81f69765bd

那么只有分号是真正的分隔符,而逗号分隔符只是因为它前面有一个过期日期。

如果你不关心过期日期的话,你可以用一个正则表达式来过滤掉过期日期,比如说:

s/expires=[^,]+,[^,]+, //g

然后用 ; 来分割整个字符串,把它们解析成 key=value 的形式。

撰写回答