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
4

3 回答 3

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

于 2012-06-28T09:01:15.727 回答
2

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

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

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

于 2012-06-28T14:26:46.287 回答
1

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

链接为我解决了它,它说要添加('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
于 2013-01-03T14:39:20.500 回答