我使用Beautifulsoup和urllib2下载网页,但不同的网页有不同的编码方法,如utf-8,gb2312,gbk。我使用urllib2得到sohu的主页,用gbk编码,但在我的代码中,我也用这种方式解码其网页:
self.html_doc = self.html_doc.decode('gb2312','ignore')
但是在使用BeautifulSoup将它们解码为unicode之前,我如何知道页面使用的编码方法?在大多数中文网站中,http Header的字段中没有内容类型。
答案 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)