爬虫之re数据提取的使用
本文将业务场景中最常用的几点实例,给大家列举出来,不常见的不再一一赘述。
使用urllib库可以模拟浏览器发送请求获得服务器返回的数据,下一步就是把有用的数据提取出来。数据分为两种形式:结构化和非结构化。
非结构化的数据一般指的是文本和HTML。文本的内容特别的杂乱,比如有电话号码,邮箱等信息,只能使用正则表达式进行提取;HTML可以使用CSS选择器,Xpath、正则表达式进行提取。
结构化的数据一般指的是JSON和XML。JSon可以使用JSonPath处理,也可以转化成python对象。XML可以转化成python对象,或者使用CSS选择器、Xpath、正则表达式进行提取。
这节主要研究一下正则表达式的使用方法和re模块的常用方法。
--------------------------------------------------------------华丽的分隔符---------------------------------------------------------------------
match():
从字符串起始位匹配,如果匹配则返回第一个次提取的内容,如果不匹配则返回None。
match中可以设置起始位置和结束位置。
![](http://upload-images.jianshu.io/upload_images/13981000-ae38b05ba059fe36.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/365/format/webp)
compile()中可以设置一些参数,re.I 表示忽略大小写,re.S表示全文匹配
![](http://upload-images.jianshu.io/upload_images/13981000-6cf7f81d248c5a1b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/420/format/webp)
除了group()还有一个方法span(),返回的是字符下标。
![](http://upload-images.jianshu.io/upload_images/13981000-48e219f253d21e4f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/419/format/webp)
切记,如果match对象为None时,使用group和span等方法会抛出异常,使用时进行非空判断。
search():
从字符串任意位匹配,如果匹配则返回第一个次提取的内容,如果不匹配则返回None。
![](http://upload-images.jianshu.io/upload_images/13981000-c5264ecace4b550d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/541/format/webp)
search中可以设置起始位置和结束位置。
![](http://upload-images.jianshu.io/upload_images/13981000-e36f51319aa4aeaf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/367/format/webp)
findall():
从字符串任意位匹配,如果匹配则返回所有提取的内容,如果不匹配则返回[]。
![](http://upload-images.jianshu.io/upload_images/13981000-23c525f0827813f0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/319/format/webp)
findall中可以设置起始位置和结束位置。
![](http://upload-images.jianshu.io/upload_images/13981000-3c97bfd0addaf0ca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/365/format/webp)
finditer():
从字符串任意位匹配,如果匹配则返回所有提取的内容组成的迭代对象,如果不匹配也返回一个迭代对象。
![](http://upload-images.jianshu.io/upload_images/13981000-1ecff5db96e69a6a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/325/format/webp)
finditer中可以设置起始位置和结束位置。
![](http://upload-images.jianshu.io/upload_images/13981000-a1682c0cb7217e03.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/372/format/webp)
finditer返回的迭代对象可以理解为match对象的集合,通过for遍历的方式,可以获取match,group方法可以获取匹配的值。
split():
从字符串任意位匹配,如果匹配,则以匹配的内容为分割点,返回切分后的list数据。
![](http://upload-images.jianshu.io/upload_images/13981000-5d4611fde05c7c60.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/383/format/webp)
![](http://upload-images.jianshu.io/upload_images/13981000-cd80e9c7b6988afe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/373/format/webp)
sub():
从字符串任意位匹配,如果匹配,则替换匹配的内容,返回替换后的字符串。
![](http://upload-images.jianshu.io/upload_images/13981000-591230728f53ccf2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/351/format/webp)
从字符串任意位匹配,如果匹配,则交换匹配的内容的位置,返回处理后的字符串。
![](http://upload-images.jianshu.io/upload_images/13981000-5025be913c33317a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/349/format/webp)
作者:爱折腾的胖子
链接:https://www.jianshu.com/p/6b443c37ed5d
來源:简书