Python学习笔记-2(urllib、re)

来源:互联网 发布:xgpush java开发 编辑:程序博客网 时间:2024/04/30 23:36

经过Python学习之路-1,学习了Python的基础语法,加上用os模块写了一些代替批处理的文件管理工具,这次打算依葫芦画瓢,写一个爬虫(以前用java写过,据说python写起来很爽啊)

这次的参考博客是:Python爬虫入门

一、简单爬虫爬取网页数据:

values ={{"name":"li"}};urllib.urlencode(values);       #1.设置post表单值(要URL编码)headers={"user-agent":"xxx"}; #2.Headers值(User-Agent标示浏览器、req = urllib2.Request(url,requestData,headers)#3.构造Rquestresp = urllib2.urlopen(request/url )#4.发送请求,拿到response对象:   data = resp.read()                  #5.然后通过read()拿到数据

二、解析数据

爬出了数据,那么下一步就是解析数据,拿到自己想要的内容,有专门的html分析工具,也可以用正则表达式。正则表达式语法就不说了,着重提一下分组和贪婪:

分组: 整个regex表达式为第0组,从左到右,第几个“(”就为第几个分组

例子: “(123)”:第0分组,第1分组 匹配的都是”123”.
\{num} #代表取第num个分组的值

贪婪匹配: 4个量词

“{m,n}”:匹配m~n次
“*”:代表匹配>=0次
“+”:代表>=1次
“?”:代表匹配0或1次
默认都是贪婪的,尽可能多的匹配,量词后面加”?”代表非贪婪模式
例子:”\d{3,5}?” :尽可能的匹配3次


简单使用regex 匹配数据:

regex = "<a(.*) href=(.*?) (.*)>"   #正则表达式,用来拿到超链接地址pattern = re.compile(regex);        #pattern一定要先compile()resultObject = re.match(pattern,data);  #match以0位置开始匹配,若匹配失败,则返回Nonesrcs = resultObject.group(2);

match的另一种写法:resultObject = pattern.match(data);
re.compile(string[,flag]),其中flag是匹配模式,可同时生效,比如re.I | re.M。

 • re.I: 忽略大小写,(全拼:IGNORECASE)(括号内是完整写法,下同) • re.M: 多行模式,改变'^'和'$'的行为,(全拼:MULTILINE) • re.S: 点任意匹配模式,改变'.'的行为,(全拼:DOTALL) • re.L: 使\w\W\b\B\s\S,取决于当前区域设定,(全拼:LOCALE) • re.U: 使\w\W\b\B\s\S\d\D,取决于unicode定义的字符属性,(全拼:UNICODE) • re.X: 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。(全拼:VERBOSE)

以下为匹配所用函数

re.match(pattern, string[, flags]);#只在0位置开始匹配re.search(pattern, string[, flags]);#全局匹配re.split(pattern, string[, maxsplit])#将string分割后返回列表re.findall(pattern, string[, flags])#以列表形式返回全部能匹配的子串re.finditer(pattern, string[, flags])#返回顺序Match对象的迭代器re.sub(pattern, newstring, string[, count])#替换匹配到的字符串re.subn(pattern, newstring, string[, count])#返回替换次数count

resultObject(match对象)是一次匹配的结果,包含了很多关于此次匹配的信息
Mathch对象的属性:

1.string: 匹配时使用的文本。2.re: 匹配时使用的Pattern对象。3.pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。4.endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。5.lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。6.lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。

Mathch对象的方法:

1.group(num=0):获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。2.groups(default=None):以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。3.groupdict(default=None):返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。4.start(group=0):返回指定的组匹配的子串,在原string中的开始位置(子串第一个字符的索引)。注意索引是从0开始的5.end(group=0):返回指定的组匹配的子串,在原string中的结束位置(子串最后一个字符的索引+1)。6.span(group=0):    返回匹配区间[start,end]。7.expand(template):  以指定格式返回匹配到的字符串temolate: 以 \num 、\g<num> 、\g<name> 引用分组这里的"\"要转义: "\\2""\\g<2>" 
0 0
原创粉丝点击