如何使用python解码和编码网页?

时间:2015-01-28 04:52:30

标签: python web encoding

我使用Beautifulsoup和urllib2下载网页,但不同的网页有不同的编码方法,如utf-8,gb2312,gbk。我使用urllib2得到sohu的主页,用gbk编码,但在我的代码中,我也用这种方式解码其网页:

self.html_doc = self.html_doc.decode('gb2312','ignore')

但是在使用BeautifulSoup将它们解码为unicode之前,我如何知道页面使用的编码方法?在大多数中文网站中,http Header的字段中没有内容类型。

3 个答案:

答案 0 :(得分:2)

使用BeautifulSoup,您可以解析HTML并访问original_encoding attrbute:

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen('http://www.sohu.com').read()
soup = BeautifulSoup(html)

>>> soup.original_encoding
u'gbk'

这与HTML <meta><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'}

答案 1 :(得分:0)

我知道这是一个古老的问题,但是今天我花了一段时间困惑一个特别有问题的网站,所以我想分享一下对我有用的解决方案,我从这里得到了http://shunchiubc.blogspot.com/2016/08/python-to-scrape-chinese-websites.html

请求具有一项功能,该功能将自动获取网站的实际编码,这意味着您不必费心对其进行编码/解码(在我发现这一点之前,我在尝试对字符串进行编码/解码时遇到了各种各样的错误/ bytes,并且永远不会获得任何可读的输出)。此功能称为“ apparent_encoding”。这是对我有用的方法:

from bs4 import BeautifulSoup
import requests

url = 'http://url_youre_using_here.html'
readOut = requests.get(url)
readOut.encoding = readOut.apparent_encoding #sets the encoding properly before you hand it off to BeautifulSoup
soup = BeautifulSoup(readOut.text, "lxml")

答案 2 :(得分:0)

另一种解决方案。

from simplified_scrapy.request import req
from simplified_scrapy.simplified_doc import SimplifiedDoc
html = req.get('http://www.sohu.com') # This will automatically help you find the correct encoding
doc = SimplifiedDoc(html)
print (doc.title.text)