要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,不过正则好像好烦人的样子,那么如何做呢,熟记正则元字符和语法,找个在线匹配测试网站随时测试(其实在正则上我也是个菜逼。。。一直在慢(询)慢(问)测(大)试(牛)中得到正解),不过要相信,用熟了自然就巧了!

  首先,推荐两篇博客,分别介绍了python自带的正则标准库re以及regex模块:Python正则表达式指南(re)     Python的regex模块——更强大的正则表达式引擎。而我呢,最不擅长总结各种库各种语法之类的了,本篇博客就稍微简单介绍常用的以及爬虫程序开发过程中的小例子!先说说比较常用的6个re中的函数:

  re.compile(pattern,flag)#根据正则匹配字符串以及附加条件,返回一个pattern对象

  re.search(pattern,string)#搜索整个字符串,知道发现符合正则表达式的字符串

  re.match(pattern,string)#从头开始检测字符串是否符合正则表达式,必须从字符串的第一个字符开始

  re.sub(pattern,replacement,string)#将字符串中根据正则匹配到的字符串用replacement替换

  re.split(pattern,string)#根据正则表达式分割字符串,将分割后的字符串放到list中返回

  re.findall(pattern,string)#根据正则表达式分割字符串,将找到的所有结果放到list中返回

  python中的匹配默认是贪婪的,所谓贪婪就是尝试尽可能的匹配更多的字符,比如:正则表达式"ab*"如果用于查找字符串"abbbc",将找到"abbb",如果是非贪婪的呢,得到的结果就是"a"。同样有时候我们时刻要注意转义字符等等,在net中我们有@,在python中我们有r,用法一样哦。让我们先来看一段代码:

1 >>> import re
2 >>>
3 >>> pattern = re.compile(r'hello',re.I)
4 >>> match = pattern.match('Hello World@!')
5 >>> if match:
6 ...     print match.group()
7 ...
8 Hello
9 >>>

  在上面的代码中,我们先生成了一个pattern对象,然后进行了匹配,其中re.compile函数中,我们的re.I就是附带条件:忽略大小写。其他模式可以自行搜索之,各种模式之间可以互相配合。其实我们可以放弃用re.compile函数而直接这么写:

1 >>> match = re.match('hello','hello world!')
2 >>> print match.group()
3 hello

  这样做少了一行re.compile(pattern,flags)代码,但是也少了pattern的对象,各位如何使用之就仁者见仁智者见智吧。

  python中还可以对正则匹配的返回结果进行进一步的控制,如:

1 >>> import re
2 >>> m = re.search("output_(\d{4})","output_2016.txt")
3 >>> print m.group()
4 output_2016
5 >>> print m.group(1)
6 2016
7 >>> print m.groups()
8 ('2016',)

  可以看到,我们的正则表达式output_(\d{4}) 其中包含一个正则表达式(\d{4}),像这样被括号圈起来的正则表达式的一部分,我们称之为群(group),我们可以用m.group(index)来查询,group(0)是整个正则表达式的搜索结果,group(1)是第一个群,以此类推。。。。也许这样看着并不方便,我们可以对群起名字:

>>> import re
>>> m = re.search("(?P<year>\d{4})\.(?P<mon>\d{2})\.(?P<day>\d{2})","output_2016.01.18.txt")
>>> m.groups()
('2016', '01', '18')
>>> m.groupdict()
{'year': '2016', 'mon': '01', 'day': '18'}
>>> m.group("year")
'2016'
>>> m.group("mon")
'01'
>>> m.group("day")
'18'

  让我们看个实例:有一个文件,文件名为output_2016.01.18.txt。请读取文件名中的日期时间信息,计算出当日是星期几,并将文件名修改为output_yyyy-mm-dd-w.txt,其中w为星期几。

1 import os,re,datetime
2 filename="output_1981.10.21.txt"
3 get_time=re.search("(?P<year>\d{4})\.(?P<month>\d{2})\.(?P<day>\d{2})\.",filename)
4 year=get_time.group("year")
5 month=get_time.group("month")
6 day=get_time.group("day")
7 date=datetime.date(int(year),int(month),int(day))
8 wd=date.weekday()+1
9 os.rename(filename,"output_"+year+"-"+month+"-"+day+"-"+str(wd)+".txt")

  好了,正则基础就介绍到这里了,接下来让我们试着进行一下爬虫中的正则表达式。讲个小例子:什么值得买的白菜价包邮信息。

  什么值得买——白菜价

  要爬取网页信息,除了我们要得到网页信息外最重要的就是把我们需要的信息提取出来,我们f12来看一下要提取的html代码:

  我们看到我们想要得到的信息都在<h2 class="itemName">...</h2>之中。我们的正则表达式如下:

1 content = response.read().decode('utf-8')
2 pattern = re.compile('<h2 .*?itemName"><a.*?<span .*?black">(.*?)</span><span .*?red">(.*?)</span></a></h2>',re.S)
3 items = re.findall(pattern,content)
4 for item in items:
5     print item[0],item[1]

  .*?是一个固定搭配,.和*可以匹配任意多个字符,加上?就是最小匹配,也就是我们上面说的非贪婪模式。直白的说就是匹配尽可能短的字符串。

  (.*?)这个上面我们讲了,他是正则匹配时的一个群。re.S标志在正则匹配的时候为点任意匹配模式,即点可以代表任意字符比如换行符。这样我们就获得了每个商品的名称和价格。(整个爬虫源码在下一篇博客)

转载于:https://www.cnblogs.com/jixin/p/5139484.html

自学Python六 爬虫基础必不可少的正则相关推荐

  1. 自学Python五 爬虫基础练习之SmartQQ协议

    BAT站在中国互联网的顶端,引导着中国互联网的发展走向...既受到了多数程序员的关注,也在被我们所惦记着... 关于SmartQQ的协议来自HexBlog,根据他的博客我自己也一步一步的去分析,去尝试 ...

  2. 杭州自学python爬虫_金华自学python网络爬虫直播

    金华自学python网络爬虫直播操作符说明实例.表示任何单个字符?[ ]字符集,对单个字符给出取值范围[abc],表示a,b,c,[a-z]表示a到z的单个字符[^ ]非字符集,对单个字符给出排除范围 ...

  3. Python网络爬虫第一课----Python网络爬虫基础《http和https协议》

    Python网络爬虫第一课----Python网络爬虫基础<http和https协议> 一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protoc ...

  4. 零基础自学python的app-零基础初学Python,需要装什么软件?

    前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取! 学习Python需要安装什么软 ...

  5. Python网络爬虫基础

    目录 目录 一.HTML基础 1.HTML相关概念&发展历史 1.1HTML及相关概念的介绍 1.2HTML发展历史 ​编辑2.WEB标准.W3C/ECMA相关概念 2.1WEB标准的概念及组 ...

  6. 学习python需要什么基础-自学python需要什么基础,要掌握哪些知识?

    Python语言的应用非常广泛.我们一定要掌握一些基础知识的储备,如果缺少一些基础知识的储备,那么我们在学习Python语言的过程中将会会感觉到非常难,比如,在学习Python语言的过程中我们需要具备 ...

  7. 零基础自学python教程-零基础5个月快速学会Python的秘诀

    点击蓝字"python教程"关注我们哟! 零基础该怎么快速学习Python呢?如何用5个月快速学会Python? 1 这里主要讲一下python基础与爬虫 个人认为可以分为两步走: ...

  8. python网络爬虫基础day01

    2019.5.13,今天在"小猿圈"跟着波波老师学习了爬虫开发的第一章和第二章,总结下今天学的知识: 爬虫基础介绍: 什么是爬虫? - 通过编写程序,模拟浏览器上网,然后让其去互联 ...

  9. python是什么 自学-自学python需要什么基础,要掌握哪些知识?

    Python语言的应用非常广泛.我们一定要掌握一些基础知识的储备,如果缺少一些基础知识的储备,那么我们在学习Python语言的过程中将会会感觉到非常难,比如,在学习Python语言的过程中我们需要具备 ...

最新文章

  1. 异步编程模型--使用 IAsyncResult 对象
  2. 《solidity学习笔记》chapter 3-solidity其他知识
  3. MapReduce基础开发之十二ChainMapper和ChainReducer使用
  4. Eureka常用配置详解
  5. 彻底卸载WinStdup
  6. SAP Spartacus PagelayoutComponent里的section和slot
  7. 在linux上实现DllMain + 共享库创建方法
  8. input的属性AutoComplete——关闭浏览器文本框自动提示
  9. 社区出入登记源码1.0.53完整安装包+小程序前端+公众号
  10. 进程与线程的四个区别
  11. java project 项目在 linux 下面部署步骤
  12. PTA基础编程题目集6-4求自定类型元素的平均 (函数题)
  13. su 与 su - 区别
  14. jQuery 添加 input 表单提交 无数据
  15. 如何用手机连接无线网络
  16. Ubuntu 22.04 双网卡网关设置报错:Conflicting default route declarations for IPv4
  17. 淘宝商品比价定向爬虫实例介绍
  18. codeforces竞赛1141题解
  19. 期刊影响因子的中外算法差别很大
  20. 【微信每日早安推送】每日天气推送

热门文章

  1. python 中的 for-else 和 while-else 语句
  2. 3D数学基础:图形与游戏开发---随笔五
  3. 【C/C++多线程编程之七】pthread信号量
  4. nginx中js修改不生效的问题
  5. 微信终端跨平台组件 mars 系列(二) - 信令传输超时设计
  6. [译】Diving Into The Ethereum VM
  7. 【译】Jumping into Solidity —The ERC721 Standard (Part 1)
  8. Android免Root环境下Hook框架Legend原理分析
  9. Android dex分包方案 (多dex)
  10. ajax asp后台获取不到post数据,jQuery AJAX调用将数据发布到ASP.Net页面(不是Get但POST)...