爬取网页的时候,如果网页编码又有utf-8还有gbk,这种情况有解吗?

2013-05-28 09:09:43 +08:00
 sivacohan
给大学的网站写个爬虫。爬各个学院和教务处的通知。
各个学院的网站太奇葩了。
编码声明charset = utf-8
实际上使用gbk。

遇到一个页面存在两种编码的情况,我就要压制想打人的冲动。
4000 次点击
所在节点    Python
9 条回复
phuslu
2013-05-28 09:12:58 +08:00
chardet
fishsjoy
2013-05-28 09:24:56 +08:00
非互联网公司的网页很多这样,chardet探测吧
alsotang
2013-05-28 12:57:50 +08:00
xingzhi
2013-05-28 13:21:06 +08:00
这是我以前写过的一段话,若有错误请指正:

对于网页编码的处理,一般是按以下几个顺序的:
1. 在http response headers, content-type中的charset属性值
2. 网页源码中, header里meta标签中, content属性中指定的charset值
3. xml文件中的encoding
4. 自动检测

可是,以上的情况,对于不遵循标准的网站来说,就会成问题了,例如:
response headers没有提供charset
response headers中的charset值与网页源码中的charset值不一样

如何解决?

我想的就是,浏览器怎么做,我就怎么做。
查了下资料,对于浏览器而言, 它也是按上述顺序来进行编码检测的, 并且:
当response headers没有提供charset时, 检测meta中的charset,
当两者不一样时,使用的是response headers中的charset。
xingzhi
2013-05-28 13:22:12 +08:00
补充: 之所以不直接使用chardet, 是因为它的处理速度比较慢。
可以在charset判断不出编码的情况下,再来使用chardet。
013231
2013-05-28 13:32:51 +08:00
可以利用頻率統計和狀態機推測真編碼:
http://mxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/base/
luikore
2013-05-28 13:50:26 +08:00
这种网页也没什么爬的价值...
lookhi
2013-05-28 13:56:48 +08:00
国内的你可以直接尝试UTF8 不行就直接GBK或GB18030
如果还不行,就放弃。这种不标准的一般都在这2个内.
xuan_lengyue
2013-05-28 14:42:36 +08:00
如果只是 GBK 和 UTF8 之间纠结的话可以检测的,UTF8 具有比较明显的特征,所以只要这段数据不是 UTF8 编码就是 GBK 了。

我目前用的一段代码见
https://gist.github.com/fireblue/5660870

基本上是 C 的,供楼主参考。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/70362

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX