我有以下代码:
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
。
答案 0 :(得分:4)
\ufeff
是ZERO WIDTH NO-BREAK SPACE codepoint;打印时不会渲染。它用作UTF-16和UTF-32中的byte order mark来记录编码字节的解码顺序(big-endian或little-endian)。
UTF-8不需要BOM(它只有一个固定的字节顺序,不需要跟踪备选方案),但Microsoft认为它是一个方便的签名字符用于他们的工具检测UTF-8文件与8位编码(例如大多数Windows代码页使用)。
我怀疑您使用的是Microsoft文本编辑器(如记事本)来保存代码。不要这样做,它将包括BOM,但Python不支持它或从UTF-8源文件中删除它。您可能使用记事本保存了该文件,然后继续使用其他工具将更多代码添加到开头,并且BOM卡在中间。
删除整行和下一行并重新输入,或者从您定义的字符串的结束引号中选择,直到下一行h
的{{1}}之前,删除部分并重新插入换行符和足够的缩进。
如果您的编辑器在搜索和替换时支持使用转义序列(例如,在正则表达式模式下,SublimeText会执行),您可以使用 来搜索该字符并将其替换为空字符串。在SublimeText中,启用正则表达式支持并搜索headers
,用空字符串替换这些匹配项。
您在此处使用的Python \x{feff}
编码还包括该BOM:
utf-8-sig
HTTP标头应不包含该代码点。 HTTP标头通常坚持使用Latin-1;甚至ASCII就足够了,但是否则使用headers['User-Agent'] = usag.encode('utf-8-sig')
(没有'utf-8'
)。
你真的不需要在那里使用-sig
,你也可以 定义一个字节串:
str.encode()
请注意字符串文字的headers = {}
usag = b'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0'
headers['User-Agent'] = usag
前缀。
答案 1 :(得分:0)
简单地说,在Notepad ++中打开脚本文件,转到"编码"选项卡,选择"在没有BOM的情况下以UTF-8编码"并保存文件。
答案 2 :(得分:-1)
在usag = 'Mozilla...
行的结束引号之后,该字符就在那里。