昨天被这个事情简直快要逼疯了,用Python获取到网页后用正则表达式提取中文信息,竟然一直显示正则表达式没有找到匹配项;忍无可忍上find()测试,结果返回值竟然是-1,可测试的文字就在眼前。

搜了一下没到找类似的问题,只能自己动手了。在一番排查确定我用的字符串函数find()没问题后,开始转而怀疑是不是字符编码的问题,因为我的代码部分可以确保是UTF-8,但获取到的网页的编码是不确定的,而且Python2对中文的支持简直太痛苦了...

在Chrome里手动访问要爬取的网页后右键另存为,然后用Sublime Text打开,果然有问题:

就是因为网页是GBK编码,用Python处理时不会自动转换编码,所以使用find()查找里面的中文完全没用!!!

注意:想要验证GBK编码需要直接另存为,然后再打开,复制粘贴编码也会自动转换看不出来;另外使用print打印GBK编码中文时,也不会出现乱码之类的。

解决的办法很简单,针对字符串,用到Python提供的两个函数:decode()encode(),即只需要:

str=str.decode('gbk').encode('utf-8')

下面是代码示例:

# -*- coding: utf-8 -*-
f = open('test', 'r')  # test即GBK编码文件
content = f.read()
f.close()
print content
# '<!DOCTYPE html PUBLIC>
#<title>
#    南京理工大学毕业设计(论文)管理系统
#</title>'
print "转码前查找'DOCTYPE'位置:", content.find('DOCTYPE')
# '转码前查找'DOCTYPE'位置: 2'
print "转码前查找'大学'位置:", content.find('大学')
# '转码前查找'大学'位置: -1'
content = content.decode('gbk').encode('utf-8')  # 一定不能忘了给str赋值
print "转码后查找'大学'位置:", content.find('大学')
# '转码后查找'大学'位置: 44'