一、模拟浏览器获取整个页面数据
(1)代码
import urllib
def Gethtml(url):
page=urllib.urlopen(url)
html=page.read()
return html
(2)解释
urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据。
urllib.urlopen()方法用于打开一个URL地址。read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。
(3)打印有可能遇到编码问题,这个最后讲
二、正则表达式
(1)正则表达式
正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串,可以匹配其自身。换包话说,正则表达式’python’ 可以匹配字符串’python’ 。你可以用这种匹配行为搜索文本中的模式,并且用计算后有值并发特定模式,或都将文本进行分段。
(2)通配符
通配符
意义
举例
.
任何除换行符之外的字符
\
特殊字符转义
python\.org
|
整个模式或匹配,匹配任意一个
‘python | perl’
()
模式一部分进行匹配
‘p(ython | erl)’
?
匹配前一个字符0次或1次
非贪婪匹配
*
允许重复0次或多次
+
允许重复1次或多次
{m}
匹配前一个模式m次
(pattern){m} ab{2}c ->abbc
{m,n}
允许模式重复m~ n 次
(pattern){m,n}
\d
数字[0-9]
\D
非数字
\s
空白符[<空格>\t\r\n\f\v]
\S
非空白符
\w
单词字符[A-Za-Z0-9]
\W
非单词字符
注意:
(1)?
python的数量词默认贪婪匹配,例如ab*查找abbbc,得到abbb,用通配符?变为非贪婪匹配
ab*?可以得到ab
(2)\
该符号可能出现在文本中,就需要两次‘\’
或可以使用r‘\’代表‘\\’
二、re模块常用函数
函数名
功能
Tips
compile(pattern)
产生模式
search(pattern,string)
字符串开始匹配模式
若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个
split(pattern,string)
模式的匹配进行分割
如果没有加小括号,则返回结果就是用正则表达式匹配的groups;
如果加了小括号,会返回所有的groups,包括不匹配的groups也会包括在返回结果中。
findall(pattern,string)
列举出字符串中模式的所有匹配项
默认贪婪匹配,非贪婪匹配注意小括号的使用
三、编码问题
编码问题往往让人头疼呀~
总结一句:在哪里输出就要符合输出平台的编码类型
1、获取编码类型
(1)网页的编码类型,能在源码看到
(2)平台的编码类型,如python(不论是IDE还是.py文件),可以使用:
import sys
print sys.getdefaultencoding()
(3)文件的编码类型(涉及到文件路径时候需要注意)
import sys
print sys.getfilesystemencoding()
比如,我们经常遇到字符串和将其输出到终端显示字符不一致。原因就是终端的编码类型和该字符编码类型不一致
python文件中字符串(UTF-8编码)输出windows的cmd中,因为cmd默认GBK编码,会乱码
2、python编码规范
(1)声名编码类型
# -*- coding:utf-8 -*-
# coding=
任选,但是注意:虽然我们python文件声明的UTF-8编码,但是实际上若是用GBK编码,而此时,文件中的字符串,很明显是用GBK存储,所以【实际为主】
(2)简化输入语句(u“我爱我家”→"我爱我家" )
文件开头使用from __future__ import unicode_literals以此避免在中文前面加u,以考虑到迁移到python3。
3、从哪里来到哪里去的问题(原来编码类型,输出平台编码类型)如何去?需要转换(decode->encode)
string.decode("utf-8").encode(""gbk") ( utf-8->gbk)
举一反三:编码就那么几种类型(utf-8、gbk、gb2312、gb18030),只有当decode内参数值是string的编码类型时候,才能语句执行通过,因此可以通过有技巧地尝试来检验一个string的编码类型
4、自己踩过的坑
(1)打印网页html时候中文还是正常显示,但是匹配findall函数之后中文就变成utf-8码了,不明白,utf-8码也能显示中文呀,为什么不能转换过来呢?
原因:findall之后的结果是list,list打印能执行,但会遇到不显示中文的结果
解决方案:打印string型数据就可以了,print list[n]
(2)写入excel文件正常显示中文,将编码类型引入
workook=xlwt.Workbook(encoding="utf-8")#建立excel文件
ws=workbook.add_sheet(SheetName)#建立sheet,建立顺序变化的字符串名字 :SheetName="sheet"+"_".join(str(i+1))
ws.write(cell_i,cell_j,TemTableHead,badFontStyle)#cell_i和cell_j分别是网格横纵坐标,从0开始
workbook.save(WorkbookName)#保存表格
(3)再补充个写入txt文件
f=file(filename,"w")
f.append()
f.writelines()等函数灵活使用即可
注意在pycharm中写的时候,会提示函数,可以看下函数名和参数,猜一下函数功能,然后在去浏览器搜索目标函数,效率更高。
四、账号密码登录方法
未完待续...