【python学习笔记】用正则表达式从含中文的网页中提取数据(含编码转换)

目标:用正则表达式从含中文的网页中提取数据

1、获得网页全部数据

1.1思考过程

确定我们要操作的网页:url = 'http://q.stock.sohu.com/cn/603077/cwzb.shtml'
打开要操作的网页:req = urllib2.open(url)
读取网页,并将网页数据放入变量:html = req.read()
别忘了把网页关了:req.close()

1.2把以上过程写成函数:

def get_html(url):
	try:
		req = urllib2.open(url)
		html = req.read()
		return html
	finally:
		req.close()
html = get_html('http://q.stock.sohu.com/cn/603077/cwzb.shtml')


2、查看网页

2.1思考过程

因为不用会开发工具直接查看网页源代码,顺便为练习I/O,因此,打算把网页输出到TXT。
打开可写文件:file = open('C:/Users/YourName/Desktop/text.txt','w')
将网页数据写入文件:file.write(html)
别忘了把文件关了:file.close()

2.2把以上过程写成函数:

def out_put(file_name,content):
	try:
		file = open(file_name,'w')
		file.write(content)
	finally:
		file.close()


out_put('C:/Users/YourName/Desktop/text.txt',html)

运行后,在桌面的text文件里查看网页源代码。

3、分析网页源代码

3.1确定网页编码

查看网页源代码,一般在head处,会标明编码类型,本例测试网页中的编码类型为:gb2312
有些网页head处标明的编码类型与实际不符,很没素质,会导致后续代码不可用,因此,有第三方py包chardet用于测试str编码类型(本人未下载,不会用)。

3.2确定拟抓取数据

想抓取“利润总额”的数值和百分比,查看源代码,“利润总额”附近代码如下:
……











利润总额





19392








-72.22%



……

3.3正则表达式

表达式中有中文,别忘加"u";任何时候,别忘加"r"
expression = ur'利润总额\D+?(-?\d+\.?\d*)\D*?(-?\d+.*?%)'


3.4一件很严肃的事!!!

由于此处有非中文字符,因此,“格式”中须选择“以utf-8格式编码”,不能选“无BOM”,否则运行就报错,原因不明。

4、提取数据

pattern = re.compile(expression)
result = pattern.findall(html)


另一件很严肃的事!!!
以此代码运行,正则啥也匹配出来,原因在于网页html的编码为gb2312,而程序代码为unicode编码,两者不统一,遇到中文匹配不上,需把两者统一,即修改代码:
pattern = re.compile(expression.encode('gb2312'))	#把程序代码编码转换成'gb2312'


注:代码转换参考http://xanderzhang.iteye.com/blog/465992

5、整合

# -*- coding : utf-8 -*-
import urllib2
import re
def get_html(url):
	try:
		req = urllib2.urlopen(url)
		html = req.read()
		return html
	finally:
		req.close()
html = get_html('http://q.stock.sohu.com/cn/603077/cwzb.shtml')
expression = ur'利润总额\D+?(-?\d+\.?\d*)\D*?(-?\d+.*?%)'
pattern = re.compile(expression.encode('gb2312'))
result = pattern.findall(html)
print result

关于Unicode编码问题,参考一篇很详细的文章:http://blog.csdn.net/dao123mao/article/details/5396497

你可能感兴趣的:(【python学习笔记】用正则表达式从含中文的网页中提取数据(含编码转换))