Python Cookie 问题
import cgitb
import Cookie, urllib2
from cookielib import FileCookieJar
cgitb.enable()
c = Cookie.SmartCookie()
c['ini'] = 1
savedc = FileCookieJar()
savedc.add_cookie_header(c.output())
savedc.save()
这不是应该保存cookie吗?...
我看了无数遍Python的文档,还是搞不懂 :(
求助啊,有人帮帮我吗 :(
2 个回答
确保你给存储 cookies 的文件起个名字:
savedc = FileCookieJar('cookies.txt')
add_cookie_header
这个函数需要一个请求对象;而 set_cookie
需要一个 cookie。文档里提到,FileCookieJar.save
会“抛出 NotImplementedError。子类可能不实现这个方法。”所以,看来你应该多看看文档,至少 1E6+1 次。
Raf,我只能说,天哪!文档真的是不清楚!我用Python已经很多年了,原本以为这个简单的Stack Overflow问题可以快速解决,结果花了我超过二十分钟才搞定。:-)
首先,"Cookie"库和"cookielib"库完全是两个不同的东西,没什么关系。文档里有说明,但你得往下滚到每个文档页面的“另见”部分才能找到这个信息。如果能把这个放在每个页面的顶部就好了。
所以,当你把"Cookie"库里的一个对象传给"cookielib"时,你会搞混"cookielib"的内部逻辑,因为它把cookies存储在字典里,而"Cookie"库里的cookie看起来——你猜怎么着!——就像一个字典,所以"cookielib"把它误认为是自己内部的数据结构之一,结果把其他的cookies都存到里面去了。于是我得到的错误是:
<type 'exceptions.AttributeError'>: 'str' object has no attribute 'discard'
args = ("'str' object has no attribute 'discard'",)
message = "'str' object has no attribute 'discard'"
其实,那是我在给Cookie.Cookie对象加了一堆不该有的属性之后才得到的错误,但在我意识到自己在做一件无望的事情,试图让Cookie.Cookie像cookielib.Cookie那样工作之前,我已经加了这些属性。:-) 之前的错误都是缺少属性的错误,比如:
<class 'Cookie.CookieError'>: Invalid Attribute name
args = ('Invalid Attribute name',)
message = 'Invalid Attribute name'
(我把这些错误放在这里,以防将来有不幸的人搞混了Cookie类,像我刚才那样搜索Google,但没有找到任何关于我遇到的错误的结果!)
所以在我们继续之前,我得先问问:你是想像一个网络服务器那样,给客户端发送cookies,并在客户端下次请求时试图把它们完整地拿回来,这样的话我应该告诉你"Cookie"模块是怎么工作的?还是你是在写一个网络客户端,出于测试或好玩,去处理它发送给网站的请求中的cookies,这样的话我们就应该聊聊"cookielib"?