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

经过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.构造Rquest
resp = 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位置开始匹配,若匹配失败,则返回None
srcs = 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值