我使用Beautifulsoup和urllib2来下载网页,但是不同的网页有不同的编码方法,例如utf-8、gb2312、gbk。我使用urllib2获取sohu的主页,该主页是用gbk编码的,但是在我的代码中,我也使用这种方式对其网页进行解码:
self.html_doc = self.html_doc.decode('gb2312','ignore')
但是在使用 BeautifulSoup 将页面解码为 unicode 之前,我如何才能知道页面使用的编码方法呢?在大多数中文网站中,http Header 字段中没有 content-type。
最佳答案
使用 BeautifulSoup,您可以解析 HTML 并访问 original_encoding
属性:
import urllib2
from bs4 import BeautifulSoup
html = urllib2.urlopen('http://www.sohu.com').read()
soup = BeautifulSoup(html)
>>> soup.original_encoding
u'gbk'
这与 <meta>
中声明的编码一致HTML 中的 <head>
标记:
<meta http-equiv="content-type" content="text/html; charset=GBK" />
>>> soup.meta['content']
u'text/html; charset=GBK'
现在您可以解码 HTML:
decoded_html = html.decode(soup.original_encoding)
但是没有什么意义,因为 HTML 已经可以作为 unicode 使用:
>>> soup.a['title']
u'\u641c\u72d0-\u4e2d\u56fd\u6700\u5927\u7684\u95e8\u6237\u7f51\u7ad9'
>>> print soup.a['title']
搜狐-中国最大的门户网站
>>> soup.a.text
u'\u641c\u72d0'
>>> print soup.a.text
搜狐
也可以尝试使用 chardet
来检测它模块(虽然有点慢):
>>> import chardet
>>> chardet.detect(html)
{'confidence': 0.99, 'encoding': 'GB2312'}
关于python - 如何使用Python对网页进行解码和编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28184863/