我有以下 urllib 和 BeautifulSoup 代码:
getSite = urllib.urlopen(pageName) # open current site
getSitesoup = BeautifulSoup(getSite.read()) # reading the site content
print getSitesoup.originalEncoding
for value in getSitesoup.find_all('link'): # extract all <a> tags
defLinks.append(value.get('href'))
结果:
/usr/lib/python2.6/site-packages/bs4/dammit.py:231: UnicodeWarning: Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
"Some characters could not be decoded, and were "
当我尝试阅读该网站时,我得到:
�7�e����0*"I߷�G�H����F������9-������;��E�YÞBs���������㔶?�4i���)�����^W�����`w�Ke��%��*9�.'OQB���V��@�����]���(P��^��q�$�S5���tT*�Z
该页面采用 UTF-8 格式,但服务器以压缩格式将其发送给您:
>>> print getSite.headers['content-encoding']
gzip
在通过 Beautiful Soup 运行数据之前,您需要解压缩数据。我在数据上使用 zlib.decompress() 时遇到错误,但将数据写入文件并使用 gzip.open() 从中读取数据工作正常 - 我不确定为什么。
BeautifulSoup 内部支持 Unicode;默认情况下,它会尝试解码来自 UTF-8 的非 unicode 响应。
您尝试加载的网站似乎使用了不同的编码;例如,它可以改为UTF-16:
>>> print u"""�7�e����0*"I߷�G�H����F������9-������;��E�YÞBs���������㔶?�4i���)�����^W�����`w�Ke��%��*9�.'OQB���V��@�����]���(P��^��q�$�S5���tT*�Z""".encode('utf-8').decode('utf-16-le')
뿯㞽뿯施뿯붿뿯붿⨰䤢럟뿯䞽뿯䢽뿯붿뿯붿붿뿯붿뿯붿뿯㦽붿뿯붿뿯붿뿯㮽뿯붿붿썙䊞붿뿯붿뿯붿뿯붿뿯붿铣㾶뿯㒽붿뿯붿붿뿯붿뿯붿坞뿯붿뿯붿뿯悽붿敋뿯붿붿뿯⪽붿✮兏붿뿯붿붿뿯䂽뿯붿뿯붿뿯嶽뿯붿뿯⢽붿뿯庽뿯붿붿붿㕓뿯붿뿯璽⩔뿯媽
也可能是
mac_cyrillic
:
>>> print u"""�7�e����0*"I߷�G�H����F������9-������;��E�YÞBs���������㔶?�4i���)�����^W�����`w�Ke��%��*9�.'OQB���V��@�����]���(P��^��q�$�S5���tT*�Z""".encode('utf-8').decode('mac_cyrillic')
пњљ7пњљeпњљпњљпњљпњљ0*"IяЈпњљGпњљHпњљпњљпњљпњљFпњљпњљпњљпњљпњљпњљ9-пњљпњљпњљпњљпњљпњљ;пњљпњљEпњљY√ЮBsпњљпњљпњљпњљпњљпњљпњљпњљпњљгФґ?пњљ4iпњљпњљпњљ)пњљпњљпњљпњљпњљ^Wпњљпњљпњљпњљпњљ`wпњљKeпњљпњљ%пњљпњљ*9пњљ.'OQBпњљпњљпњљVпњљпњљ@пњљпњљпњљпњљпњљ]пњљпњљпњљ(Pпњљпњљ^пњљпњљqпњљ$пњљS5пњљпњљпњљtT*пњљZ
但是我对您要加载的网站类型的信息太少,也无法读取任一编码的输出。 :-)
在将
getSite()
的结果传递给 BeautifulSoup 之前,您需要对其进行解码:
getSite = urllib.urlopen(pageName).decode('utf-16')
通常,网站会以
Content-Type
标头(可能是 text/html; charset=utf-16
或类似)的形式返回标头中使用的编码。
我遇到了同样的问题,正如伦纳德提到的,这是由于压缩格式造成的。
This 链接为我解决了这个问题,它说在请求标头中添加
('Accept-Encoding', 'gzip,deflate')
。例如:
opener = urllib2.build_opener()
opener.addheaders = [('Referer', referer),
('User-Agent', uagent),
('Accept-Encoding', 'gzip,deflate')]
usock = opener.open(url)
url = usock.geturl()
data = decode(usock)
usock.close()
return data
其中
decode()
函数定义为:
def decode (page):
encoding = page.info().get("Content-Encoding")
if encoding in ('gzip', 'x-gzip', 'deflate'):
content = page.read()
if encoding == 'deflate':
data = StringIO.StringIO(zlib.decompress(content))
else:
data = gzip.GzipFile('', 'rb', 9, StringIO.StringIO(content))
page = data.read()
return page
ge Secret, info="调用 信息”)。 3. 发送至自动聊天帐户、其他用户设备的消息,如果 相关的,聊天中的其他参与者是使用 Signal 协议发送的 加密。 发送至自动聊天帐户的消息包含消息密钥,如果 该帐户是正在发送调用消息的聊天的参与者 发送。否则,它包含调用消息机密。 发送给所有其他收件人的消息包含消息密钥。 4. 为了提高调用消息的隐私性和性能 响应,它们之前使用调用消息密钥进行加密 在调用消息中与聊天的其他参与者共享。作为 自动聊天帐户生成响应(初始响应或 更新到初始响应),它从
派生出消息加密密钥