下面的代码:
import urllib.request
try:
url = "https://www.google.com/search?q=test"
headers = {}
usag = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0'
headers['User-Agent'] = usag.encode('utf-8-sig')
req = urllib.request.Request(url, headers=headers)
resp = urllib.request.urlopen(req)
respData = resp.read()
saveFile = open('withHeaders.txt','w')
saveFile.write(str(respData))
saveFile.close()
except Exception as e:
print(str(e))
它给出了以下错误:
D:\virtualenv\samples\urllibb>python 1.py
File "1.py", line 35
usag = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0'\ufeff
^
SyntaxError: invalid character in identifier
但是在我的代码中看不到\ufeff
。
5条答案
按热度按时间aamkag611#
\ufeff
是一个ZERO WIDTH NO-BREAK SPACE codepoint;打印时不呈现。在UTF-16和UTF-32中用作byte order mark,以记录编码字节的解码顺序(big-endian或little-endian)。UTF-8不需要BOM(它只有一个固定的字节顺序,不需要跟踪替代),但微软认为它是一个方便的 * 签名 * 字符,让他们的工具检测UTF-8文件与8位编码(如大多数Windows codepage使用)。
我怀疑你正在使用一个微软的文本编辑器,比如记事本来保存你的代码。不要这样做,它会包含BOM,但是Python不支持它,或者从UTF-8源文件中删除它。你可能用记事本保存了这个文件,然后继续用一个不同的工具来添加更多的代码,BOM在中间被卡住了。
要么删除整行和下一行,然后重新键入它们,要么从所定义字符串的右引号中选择,直到下一行的
headers
的h
之前,删除该部分,然后重新插入一个新行和足够的缩进。如果你的编辑器支持在搜索和替换时使用转义序列(例如,SublimeText在regex模式下),你可以使用 that 来搜索字符并将其替换为空字符串。在SublimeText中,打开regex支持并搜索
\x{feff}
,将其替换为空字符串。这里使用的Python
utf-8-sig
编码也包括BOM:HTTP头也不应该包含这个代码点。HTTP头通常使用拉丁语-1;这里ASCII就足够了,否则使用
'utf-8'
(不是-sig
)。这里并不需要使用
str.encode()
,你 * 也 * 可以只定义一个字节串:注意字符串文字的前缀
b
。ne5o7dgx2#
只需在记事本++中打开脚本文件,转到“编码”选项卡,选择“编码为UTF-8而不使用BOM”并保存文件。
vkc1a9a23#
对于 *nix用户,只需使用以下命令打开文件
那么
你会在第一行的开头看到它,因为它的宽度为零,你甚至不能在文本模式下删除它,尝试删除这一行并粘贴文本,在python中剥离它,它仍然在文本中字符0之前。
dpiehjr44#
在大多数投票中,他们建议在Sublime Text中使用regex search/replace来替换字符。我不能让它工作,但如果你简单地“保存with Encoding”并选择UTF-8而不是UTF-8 with BOM,它会做你需要的。x1c 0d1x
gjmwrych5#
字符就在
usag = 'Mozilla...
行的右引号后面。