网址开放编码

时间:2012-06-28 08:56:53

标签: python beautifulsoup python-unicode

我有以下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

3 个答案:

答案 0 :(得分: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}}或类似标题)的形式返回标题中使用的编码。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

我遇到了同样的问题,正如Leonard所说,这是由于压缩格式造成的。

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