在您的示例代码或cookies.txt文件的副本中,我看不到任何明显错误的内容。
我已经检查了MozillaCookieJar._really_load
方法的源代码,该方法引发了您看到的异常。
该方法所做的第一件事是读取您指定的文件的第一行(使用f.readline()
),并用于re.search
查找正则表达式模式"#( netscape)? HTTP Cookie File"
。这是您的文件失败的原因。
看起来 您肯定cookies.txt
会匹配该格式,因此您看到的错误非常令人惊讶。
请注意,您的文件是通过前面的一个简单open(filename)
调用打开的,因此将在具有通用行尾支持的文本模式下打开,这意味着在Windows上运行此文件都没有关系。该代码将看到\n
换行符终止的字符串,而不管文件本身使用了什么换行符约定。
在这种情况下,我要做的是 三重检查 文件的第一行是否正确。它需要包含“#HTTP Cookie文件”或“#netscape HTTP Cookie文件”(仅在空格之间,没有制表符,单词之间,大小写匹配)。使用python提示进行测试:
>>> f = open('cookies.txt')
>>> line = f.readline()
>>> line
'# netscape HTTP Cookie File\n'
>>> import re
>>> re.search("#( netscape)? HTTP Cookie File", line)
<_sre.SRE_Match object at 0x10fecfdc8>
当我line
在提示符下键入时,Python将行表示形式反馈给我,包括\n
换行符。制表符或Unicode零宽度空格之类的任何意外内容都将在此处显示为转义码。我还验证了cookiejar
代码使用的正则表达式是否匹配。
您还可以使用pdb
python调试器来验证http.cookiejar
模块的实际作用:
>>> import pdb
>>> import http.cookiejar
>>> jar = http.cookiejar.MozillaCookieJar('cookies.txt')
>>> pdb.run('jar.load()')
> <string>(1)<module>()
(Pdb) s
--Call--
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1759)load()
-> def load(self, filename=None, ignore_discard=False, ignore_expires=False):
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1761)load()
-> if filename is None:
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1762)load()
-> if self.filename is not None: filename = self.filename
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1765)load()
-> f = open(filename)
(Pdb) n
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1766)load()
-> try:
(Pdb)
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1767)load()
-> self._really_load(f, filename, ignore_discard, ignore_expires)
(Pdb) s
--Call--
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1989)_really_load()
-> def _really_load(self, f, filename, ignore_discard, ignore_expires):
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1990)_really_load()
-> Now = time.time()
(Pdb) n
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1992)_really_load()
-> magic = f.readline()
(Pdb)
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1993)_really_load()
-> if not self.magic_re.search(magic):
(Pdb)
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1999)_really_load()
-> try:
在上面的示例pdb会话中,我使用了step
和next
命令的组合来验证正则表达式test(self.magic_re.search(magic)
)是否实际通过。