【问题标题】:Python Regex Help (httplib2 cookies)Python 正则表达式帮助(httplib2 cookie)
【发布时间】:2010-02-20 04:04:35
【问题描述】:

和这个问题的发帖人有同样的问题: httplib2, how to set more than one 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 本身也使用逗号。

这对我来说太复杂了,无法编写正则表达式来正确分隔它们,如果有人想试一试,将不胜感激!

【问题讨论】:

  • “所以组合是……一、二、三、四、五、[六]?这是我这辈子听过的最愚蠢的组合!白痴会做的那种事放在他的行李上!” - 暗头盔(有附加)

标签: python regex cookies 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

那么只有分号是真正的分隔符,而逗号分隔符只是由于前面的到期日期。

如果您对过期日期不感兴趣,那么您可以使用 1 个正则表达式来过滤掉过期日期,例如

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

然后用;分隔整个字符串,并将它们解析为key=value对。

【讨论】:

  • 谢谢,但是使用它的不仅仅是过期。我没有包含完整的 cookie,它具有以下内容:path=/, hash=0800fc577294c34e0b28ad2839435945;我还没有查看许多其他 cookie 标头,但我认为其他人也会像这样使用逗号,因此它不像过滤掉某些键值那么简单。
【解决方案2】:

注意它如何使用逗号和分号来分隔 cookie,但 cookie 本身也使用逗号。

正如引用的那样,模棱两可的逗号使字符串无法用正则表达式或任何其他工具解析。那个字符串是从哪里来的?

作为Set-Cookie: 标头值,它将完全无效,并且在任何浏览器中都不起作用。浏览器会将 PHPSESSID 设置为会话 cookie(因为过期日期格式因额外的逗号无效),而忽略其余部分。多个 cookie 必须设置多个 Set-Cookie 标头,而不是合并为一个。

编辑:好的,似乎正在发生的是 httplib2 正在使用 stdlib email 包处理 HTTP 响应数据来解析标头。在电子邮件中,RFC822 系列标准要求具有相同名称的多个标头(例如,To: 地址)等效于单个标头,其值由逗号连接。

但是,HTTP 响应明确不是 RFC822 系列标准;以这种方式处理它们是完全不合适的。看起来,通过使用email 来解析HTTP 响应,httplib2 使自己无法正确处理任何多次使用的标头,而Set-Cookie 标头经常被这样使用。出于这个原因,我认为httplib2 从根本上被破坏了,建议不要使用它。

【讨论】:

  • 这正是它从 httplib2 中的 Set-Cookie 响应标头提供给我的方式看一下代码,它们没有任何关系。对 httplib2 中处理标头的方式进行调整可能是可行的方法,尽管我真的不知道有什么变化。这是粘贴箱:pastebin.ca/1802685
  • 啊,好的。查看代码,这是httplib2 中的一个错误(见编辑)。 urllib 允许您通过使用 getheaders('Header-Name') 而不是 getheader 来获得多个标题而不会出现这种损坏的逗号组合。但httplib2 中似乎没有此类设施。
  • 实现这样的东西有多难?
  • 首先,您必须使用存储多个标头的适当 HTTP 响应解析器替换使用 email.FeedParser 进行标头解析(参见 httplib2/__init__.py 的第 1035 行)。然后你必须想出一个新的界面来访问它们。
  • 除非您在httplib2 之上构建了大量工作,否则使用不同的 HTTP 库可能会更容易。您需要哪些 stdlib urllib 和 httplib 不满足的功能? (httplib 与 httplib2 使用 HTTPResponse.getheader('Set-Cookie') 时会犯同样的错误,但您仍然可以从 HTTPResponse.msg.getheaders('Set-Cookie') 获取正确的标头。
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 2018-11-05
  • 2023-03-26
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多