Url开放编码

问题描述 投票:0回答:4

我有以下 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
python beautifulsoup python-unicode
4个回答
2
投票

该页面采用 UTF-8 格式,但服务器以压缩格式将其发送给您:

>>> print getSite.headers['content-encoding']
gzip

在通过 Beautiful Soup 运行数据之前,您需要解压缩数据。我在数据上使用 zlib.decompress() 时遇到错误,但将数据写入文件并使用 gzip.open() 从中读取数据工作正常 - 我不确定为什么。


2
投票

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
或类似)的形式返回标头中使用的编码。


1
投票

我遇到了同样的问题,正如伦纳德提到的,这是由于压缩格式造成的。

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

0
投票

ge Secret, info="调用 信息”)。 3. 发送至自动聊天帐户、其他用户设备的消息,如果 相关的,聊天中的其他参与者是使用 Signal 协议发送的 加密。 发送至自动聊天帐户的消息包含消息密钥,如果 该帐户是正在发送调用消息的聊天的参与者 发送。否则,它包含调用消息机密。 发送给所有其他收件人的消息包含消息密钥。 4. 为了提高调用消息的隐私性和性能 响应,它们之前使用调用消息密钥进行加密 在调用消息中与聊天的其他参与者共享。作为 自动聊天帐户生成响应(初始响应或 更新到初始响应),它从

派生出消息加密密钥
© www.soinside.com 2019 - 2024. All rights reserved.