03-网页内容的编码检测 | 02.数据解析 | Python

03-网页内容的编码检测

郑昀 201005 隶属于《02.数据解析》小节

我们需要确定网页的内容/标题等文字的编码格式,比如 utf-8 、gb2312 等。

通用检测顺序

一般来说,国内外类似服务的检测顺序是(参见参考资源A):

  • charset parameter in HTTP Content-type header.
  • <meta http-equiv="content-type"> element in the <head> of a web page for HTML documents.
  • encoding attribute in the XML prolog for XML documents.
  • Auto-detect the character encoding as a last resort.

也就是,HTTP Response 的 header 里 content-type 如果指定 charset 的话,优先级是高于 HTML 里的 content-type 的。

 

由于我国网络服务商不一定保持 HTTP Content-type header 与 meta charset 一致,比如新浪新闻、和讯、网易新闻的 html 里都会写明 meta charset 是 gb2312,但新浪新闻的 HTTP Content-type header 里却只输出:Content-Type: text/html ,并没有给出 charset 参数。网易新闻则 HTTP Header 中指定 GBK ,而 HTML 里却指定 GB2312 。

国外的一些服务探测我国网站时,容易因此得到乱码,如我的文章《Yahoo! Pipe的charset问题之解决方法》所说的。

 

这样带来的一个问题就是:

当 HTTP Content-type header 与 meta charset 不一致时,到底采信谁的声明?

当然也可以用 chardet 来检测内容,但 chardet 非常消耗资源,在网络爬虫中频繁调用 chardet 吞吐大量 html 字符串,会降低抓取效率。

 

BeautifulSoup 自动探测机制

BeautifulSoup 会自动判断页面编码,如果判断不出来就调用 chardet 探测。它的探测顺序是:

Beautiful Soup tries the following encodings, in order of priority, to turn your document into Unicode:

  • An encoding you pass in as the fromEncoding argument to the soup constructor.
  • An encoding discovered in the document itself: for instance, in an XML declaration or (for HTML documents) an http-equiv META tag. If Beautiful Soup finds this kind of encoding within the document, it parses the document again from the beginning and gives the new encoding a try. The only exception is if you explicitly specified an encoding, and that encoding actually worked: then it will ignore any encoding it finds in the document.
  • An encoding sniffed by looking at the first few bytes of the file. If an encoding is detected at this stage, it will be one of the UTF-* encodings, EBCDIC, or ASCII.
  • An encoding sniffed by the chardet library, if you have it installed.
  • UTF-8
  • Windows-1252

BeautifulSoup 优先用 meta charset 指示的编码进行探测,但未必对。

举一个异常的例子,http://www.miniclip.com/games/cn/ ,它的 HTTP Content-type header 是 utf-8,而 meta charset 却是 iso-8859-1,实际上它的编码是 utf-8 。

对于这种情况,怎么办?

可以让 BeautifulSoup 强制按照 HTTP Content-type 声明的编码做转换:

from BeautifulSoup import BeautifulSoup 
from urllib import urlopen 
response=urlopen('http://www.miniclip.com/games/cn/') 
charset=BeautifulSoup.CHARSET_RE.search(response.headers['content-type']) 
charset=charset and charset.group(3) or None 
page=BeautifulSoup(response.read(),fromEncoding=charset)

 

时间: 2024-12-06 17:29:01

03-网页内容的编码检测 | 02.数据解析 | Python的相关文章

android针对json数据解析方法实例分析_Android

本文实例讲述了android针对json数据解析方法.分享给大家供大家参考.具体如下: JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. – Json.org JSON Vs XML 1.JSON和XML的数据可读性基本相同 2.JSON和XML同样拥有丰富的解析手段 3.

Android网络之数据解析----SAX方式解析XML数据

[正文] 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器获取数据.不过这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语言,当另一方受到数据消息后就可以按照相同的结构规格进行解析,从而取出它想要的那部分内容. 在网络上传输数据最常用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数据解析将在下一篇文

iOS - XML 数据解析

前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Markup Language)是可扩展标记语言的缩写,其中的标记(markup)是关键部分.可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可分类的信息.创建的文件或文档实例由元素(标记)和内容构成.当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档.元素的描述

Android 中对JSON数据解析实例代码

Android 中对JSON数据解析 在Android的网络编程中,JSON是比XML使用更为广泛的数据传输机制.在许多的http网络请求或接口调用中,返回的很多都是JSON.所以学会解析JSON是学会Android的基本技能. 简单介绍下JSON,JSON是轻量级的文本数据交换格式,独立于语言和平台.比XML更小,更快,更易解析.JSON是用键值对来保存数据的.JSON保存的值可以是数字.字符串.布尔值.数组和对象. 废话少说,直接上代码.下面对以下JOSN进行解析: { "language&

数据解析需有的放矢 切忌鼻子眉毛一把抓

    数据解析在我们的线上推广一直都扮演者一个关键的角色.作为军事迷的笔者会把数据解析看做是一个空军战队中的预警机,一个空军战队无论你多么先进战机,如果没有预警机进行敌情侦查.战场侦查.空中指挥等等,那么都是一些无头苍蝇,发挥不出真正的战力.纵观现今的线上营销,很多企业在进行数据解析的时候都喜欢鼻子眉毛一把抓,局限于分析网站最近的ip.pv变化.转换率等等,很少企业可以做到真正有的放矢的数据解析 现在的线上推广方式五花八门,模式也有很多,但是即是是相同的模式且拥有相同资源,不同的产品的营销效果

php使用指定编码导出mysql数据到csv文件的方法

 本文实例讲述了php使用指定编码导出mysql数据到csv文件的方法.分享给大家供大家参考.具体实现方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <?php /* * PH

浅谈Python中数据解析

  本文给大家介绍的是Python中的数据解析的集中方式,包括列表解析.字典解析.集合解析,并附上相关示例,有需要的小伙伴可以参考下. Import os; -- Python自带 print(os.getcwd()) -- 获得当前工作目录 os.chdir('/Users/longlong/Documents') -- 转换到/Users/longlong/Documents目录 os.path.join(parm1, parm2,...) -- 从一个或多个路径片段中构造一个路径名. os

Android网络之数据解析----使用Google Gson解析Json数据

[正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                                                                                 Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式,这使得Jso

Android随手笔记44之JSON数据解析_Android

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析. 1.JSON数据结构 在JSON中有两种数据结构:对象和数组. 1.1对象 在JSON中,一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"