第3章-正则表达式与文件操作课件.pptx

上传人(卖家):晟晟文业 文档编号:5175363 上传时间:2023-02-16 格式:PPTX 页数:78 大小:5.99MB
下载 相关 举报
第3章-正则表达式与文件操作课件.pptx_第1页
第1页 / 共78页
第3章-正则表达式与文件操作课件.pptx_第2页
第2页 / 共78页
第3章-正则表达式与文件操作课件.pptx_第3页
第3页 / 共78页
第3章-正则表达式与文件操作课件.pptx_第4页
第4页 / 共78页
第3章-正则表达式与文件操作课件.pptx_第5页
第5页 / 共78页
点击查看更多>>
资源描述

1、Python Crawler Development Python Crawler Development 极客学院极客学院 JJ互联网互联网+职业技能系列职业技能系列PythonPython爬虫开发爬虫开发 从入门从入门到实战(微课版)到实战(微课版)人民邮电出版社人民邮电出版社谢乾坤谢乾坤著著第第3 3章章 正则表达式正则表达式与文件操作与文件操作 在爬虫的开发中,需要把有用的信息从一大段文本中提取出在爬虫的开发中,需要把有用的信息从一大段文本中提取出来。正则表达式是提取信息的方法之一。来。正则表达式是提取信息的方法之一。正则表达式虽然不是最简单的也不是最高效的数据提取方法,正则表达式虽然

2、不是最简单的也不是最高效的数据提取方法,但它是最直接的。而且在某些情况下,只有使用正则表达式才能但它是最直接的。而且在某些情况下,只有使用正则表达式才能达到目的。学好正则表达式,是开发爬虫的第一步。达到目的。学好正则表达式,是开发爬虫的第一步。通过通过这一章的学习,你将会掌握如下知识。这一章的学习,你将会掌握如下知识。(1)正则表达式的基本符号。)正则表达式的基本符号。(2)如何在)如何在Python中使用正则表达式。中使用正则表达式。(3)正则表达式的提取技巧。)正则表达式的提取技巧。(4)Python读写文本文件和读写文本文件和CSV文件。文件。3.1 3.1 正则表达式正则表达式 正则表

3、达式正则表达式(RegularExpression)是一段字符串,它可以表示)是一段字符串,它可以表示一段有规律的信息。一段有规律的信息。Python自带一个正则表达式模块,通过这个模自带一个正则表达式模块,通过这个模块可以查找、提取、替换一段有规律的信息。块可以查找、提取、替换一段有规律的信息。在在程序开发中,要让计算机程序从一大段文本中找到需要的内程序开发中,要让计算机程序从一大段文本中找到需要的内容,就可以使用正则表达式来实现。容,就可以使用正则表达式来实现。使用使用正则表达式有如下步骤。正则表达式有如下步骤。(1)寻找规律。)寻找规律。(2)使用正则符号表示规律。)使用正则符号表示规律

4、。(3)提取信息。)提取信息。1点号点号“.”一一个点号可以代替除了换行符以外的任何一个字符,包括个点号可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符但不限于英文字母、数字、汉字、英文标点符号和中文标点符号号。2星号星号“*”一一个星号可以表示它前面的一个子表达式(普通字符、另个星号可以表示它前面的一个子表达式(普通字符、另一个或几个正则表达式符号)一个或几个正则表达式符号)0次到无限次。次到无限次。3.1.1 3.1.1 正则表达式的基本符号正则表达式的基本符号 3问号问号“?”问号问号表示它前面的子表达式表示它前面的子表达式0次或者次或者1

5、次。注意,这里的问号次。注意,这里的问号是英文问号。是英文问号。4反斜杠反斜杠“”反反斜杠在正则表达式里面不能单独使用,甚至在整个斜杠在正则表达式里面不能单独使用,甚至在整个Python里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊里都不能单独使用。反斜杠需要和其他的字符配合使用来把特殊符号变成普通符号,把普通符号变成特殊符号。符号变成普通符号,把普通符号变成特殊符号。反反斜杠不仅可以把特殊符号变成普通符号,还可以把普通斜杠不仅可以把特殊符号变成普通符号,还可以把普通符号变成特殊符号符号变成特殊符号。例如例如“n”只是一个普通的字母,但是只是一个普通的字母,但是“n”代表换行符代表换

6、行符。在在Python开发中,经常遇到的转义字符,如表开发中,经常遇到的转义字符,如表3-1所示。所示。转义字符转义字符意义意义n换行符换行符t制表符制表符普通的反斜杠普通的反斜杠单引号单引号双引号双引号d数字数字表表3-1 常见的转义字符常见的转义字符 5数字数字“d”正则表达式正则表达式里面使用里面使用“d”来表示一位数字。为什么要用字来表示一位数字。为什么要用字母母d呢?因为呢?因为d是英文是英文“digital(数字)(数字)”的首字母。的首字母。再次再次强调一下,强调一下,“d”虽然是由反斜杠和字母虽然是由反斜杠和字母d构成的,但构成的,但是要把是要把“d”看成一个正则表达式符号整体

7、。看成一个正则表达式符号整体。6小括号小括号“()”小括号小括号可以把括号里面的内容提取出来。可以把括号里面的内容提取出来。3.1.2 3.1.2 在在PythonPython中使用正则表达式中使用正则表达式 Python 已经自带了一个功能非常强大的正则表达式模块。已经自带了一个功能非常强大的正则表达式模块。使用这个模块可以非常方便地通过正则表达式来从一大段文字使用这个模块可以非常方便地通过正则表达式来从一大段文字中提取有中提取有规律的信息。规律的信息。Python的正则表达式模块名字为的正则表达式模块名字为“re”,也就是,也就是“regular expression”的首字母缩写。在的首

8、字母缩写。在Python中需要首先导入这个模块中需要首先导入这个模块再进行使用。导入的语句为:再进行使用。导入的语句为:import re 1findall Python的正则表达式模块包含一个的正则表达式模块包含一个findall方法,它能够以列方法,它能够以列表的形式返回所有满足要求的字符串。表的形式返回所有满足要求的字符串。findall的函数原型为:的函数原型为:re.findall(pattern,string,flags=0)pattern表示正则表达式,表示正则表达式,string表示原来的字符串,表示原来的字符串,flags表表示一些特殊功能的标志。示一些特殊功能的标志。fin

9、dall的结果是一个列表,包含了所有的匹配到的结果。如的结果是一个列表,包含了所有的匹配到的结果。如果没有匹配到结果,就会返回空列表,如图果没有匹配到结果,就会返回空列表,如图3-1所示。所示。图图3-1 findall返回的内容返回的内容 当当需要提取某些内容的时候,使用小括号将这些内容括起需要提取某些内容的时候,使用小括号将这些内容括起来,这样才不会得到不相干的信息。如果包含多个来,这样才不会得到不相干的信息。如果包含多个“(.*?)”怎么怎么返回呢?如图返回呢?如图3-2所示,返回的仍然是一个列表,但是列表里面所示,返回的仍然是一个列表,但是列表里面的元素变为了元组,元组里面的第的元素变

10、为了元组,元组里面的第1个元素是账号,第个元素是账号,第2个元素个元素为密码。为密码。图图3-2 多个括号内的内容会以元组形式返回多个括号内的内容会以元组形式返回 请请注意代码中的冒号和逗号,图注意代码中的冒号和逗号,图3-1代码中为中文冒号和中代码中为中文冒号和中文逗号;图文逗号;图3-2代码中为英文冒号和英文逗号。在实际使用正则代码中为英文冒号和英文逗号。在实际使用正则表达式的过程中,中英文标点符号混淆常常会导致各种问题。表达式的过程中,中英文标点符号混淆常常会导致各种问题。特别是冒号、逗号和引号,虽然中英文看起来非常相似,但实特别是冒号、逗号和引号,虽然中英文看起来非常相似,但实际上中文

11、冒号和英文冒号是不一样的,中文逗号和英文逗号也际上中文冒号和英文冒号是不一样的,中文逗号和英文逗号也是不一样的是不一样的。在在某些字体里面,这种差异甚至无法察觉,因此在涉及正某些字体里面,这种差异甚至无法察觉,因此在涉及正则表达式中的标点符号时,最好直接复制粘贴,而不要手动输则表达式中的标点符号时,最好直接复制粘贴,而不要手动输入。入。函数函数原型中有一个原型中有一个flags参数。这个参数是可以省略的。当参数。这个参数是可以省略的。当不省略的时候,具有一些辅助功能,例如忽略大小写、忽略换不省略的时候,具有一些辅助功能,例如忽略大小写、忽略换行符等。这里以忽略换行符为例来进行说明,如图行符等。

12、这里以忽略换行符为例来进行说明,如图3-3所示。所示。图图3-3 3-3 使用使用re.Sre.S作为作为flagflag来忽略换行符来忽略换行符 在在爬虫的开发过程中非常容易出现这样的情况,要匹配的爬虫的开发过程中非常容易出现这样的情况,要匹配的内容存在换行符内容存在换行符“n”。要忽略换行符,就需要使用到。要忽略换行符,就需要使用到“re.S”这个这个flag。虽然说匹配到的结果中出现了。虽然说匹配到的结果中出现了“n”这个符号,不过这个符号,不过总比什么都得不到强。内容里面的换行符在后期清洗数据的时总比什么都得不到强。内容里面的换行符在后期清洗数据的时候把它替换掉即可。候把它替换掉即可。

13、2search search()的用法和的用法和findall()的用法一样,但是的用法一样,但是search()只会返回只会返回第第1个满足要求的字符串。一旦找到符合要求的内容,它就会停个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。对于从超级大的文本里面只找第止查找。对于从超级大的文本里面只找第1个数据特别有用,可个数据特别有用,可以大大提高程序的运行效率。以大大提高程序的运行效率。search()的函数原型为:的函数原型为:re.search(pattern,string,flags=0)对于对于结果,如果匹配成功,则是一个正则表达式的对象;结果,如果匹配成功,则是一个正则表

14、达式的对象;如果没有匹配到任何数据,就是如果没有匹配到任何数据,就是None。如果如果需要得到匹配到的结果,则需要通过需要得到匹配到的结果,则需要通过.group()这个方法这个方法来获取里面的值,如图来获取里面的值,如图3-4所示。所示。图图3-4 使用使用.group()来获取来获取search()方法找到的结果方法找到的结果 只有只有在在.group()里面的参数为里面的参数为1的时候,才会把正则表达式里的时候,才会把正则表达式里面的括号中的结果打印出来。面的括号中的结果打印出来。.group()的参数最大不能超过正则表达式里面括号的个数。的参数最大不能超过正则表达式里面括号的个数。参数

15、为参数为1表示读取第表示读取第1个括号中的内容,参数为个括号中的内容,参数为2表示读取第表示读取第2个个括号中的内容,以此类推,如图括号中的内容,以此类推,如图3-5所示。所示。图图3-5 .group()的参数意义的参数意义 3“.*”和和“.*?”的区别的区别 在在爬虫开发中,爬虫开发中,.*?这这3个符号大多数情况下一起使用。个符号大多数情况下一起使用。点点号表示任意非换行符的字符,星号表示匹配它前面的字符号表示任意非换行符的字符,星号表示匹配它前面的字符0次或者任意多次。所以次或者任意多次。所以“.*”表示匹配一串任意长度的字符串任意表示匹配一串任意长度的字符串任意次。这个时候必须在次

16、。这个时候必须在“.*”的前后加其他的符号来限定范围,否则的前后加其他的符号来限定范围,否则得到的结果就是原来的整个字符串。得到的结果就是原来的整个字符串。如果如果在在“.*”的后面加一个问号,变成的后面加一个问号,变成“.*?”,那么可以得,那么可以得到什么样的结果呢?问号表示匹配它前面的符号到什么样的结果呢?问号表示匹配它前面的符号0次或者次或者1次。于次。于是是.*?的意思就是匹配一个能满足要求的最短字符串。的意思就是匹配一个能满足要求的最短字符串。这样这样说起来还是非常抽象,下面通过一个实际的例子来进行说起来还是非常抽象,下面通过一个实际的例子来进行说明。请看下面这一段话:说明。请看下

17、面这一段话:我的微博密码是:我的微博密码是:1234567,QQ密码是:密码是:33445566,银行卡密银行卡密码是:码是:888888,Github密码是:密码是:999abc999,帮我记住它们,帮我记住它们 这这段话有一个显著的规律,即密码是:段话有一个显著的规律,即密码是:xxxxxx,”,也就是,也就是在在“密码是密码是”这这3个汉字的后面跟一个中文的冒号,冒号后面是个汉字的后面跟一个中文的冒号,冒号后面是密码,密码后面是中文的逗号。密码,密码后面是中文的逗号。如果如果想把这想把这4个密码提取出来,可以构造以下两个正则表达个密码提取出来,可以构造以下两个正则表达式:式:密码是:密码

18、是:(.*),密码是:密码是:(.*?),配合配合Python的的findall方法,得到结果如图方法,得到结果如图3-6图所示。图所示。图图3-6 使用使用“.*”和和“.*?”返回的结果返回的结果 使用使用“(.*)”得到的是只有一个元素的列表,里面是一个很得到的是只有一个元素的列表,里面是一个很长的字符串。长的字符串。使用使用第第2个正则表达式个正则表达式“(.*?)”,得到的结果是包含,得到的结果是包含4个元素个元素的列表,每个元素直接对应原来文本中的每个密码。的列表,每个元素直接对应原来文本中的每个密码。一句话一句话总结如下。总结如下。“.*”:贪婪模式,获取最长的满足条件的字符串。

19、:贪婪模式,获取最长的满足条件的字符串。“.*?”:非贪婪模式,获取最短的能满足条件的字符串。:非贪婪模式,获取最短的能满足条件的字符串。3.1.3 3.1.3 正则表达式提取技巧正则表达式提取技巧1不需要不需要compile 网上很多人的文章中,正则表达式使用网上很多人的文章中,正则表达式使用pile()这个方法,这个方法,导致代码变成下面这样:导致代码变成下面这样:import re example_text=我是我是kingname,我的微博账号是我的微博账号是:kingname,密密码是码是:12345678,QQ账号是账号是:99999,密码是密码是:890abcd,银行卡账号是银行

20、卡账号是:000001,密码是密码是:654321,Github账号是账号是:,密码是密码是:7777love8888,请记住他们。请记住他们。new_pattern=pile(账号是账号是:(.*?),密码是密码是:(.*?),re.S)user_pass=re.findall(new_pattern,example_text)print(user_pass)这种这种写法虽然结果正确,但纯粹是画蛇添足,是对写法虽然结果正确,但纯粹是画蛇添足,是对Python的的正则表达式模块没有理解透彻的体现,是从其他正则表达式模块没有理解透彻的体现,是从其他啰啰嗦的编程语言嗦的编程语言中带来的坏习惯。如果

21、阅读中带来的坏习惯。如果阅读Python的正则表达式模块的源代码,的正则表达式模块的源代码,就可以看出就可以看出pile()是完全没有必要的。是完全没有必要的。对比对比pile()和和re.findall()在源代码中的写法,如图在源代码中的写法,如图3-7所所示的两个方框。示的两个方框。图图3-7 Python正则表达式模块中的正则表达式模块中的re.findall()和和pile()使用使用pile()的时候,程序内部调用的是的时候,程序内部调用的是_compile()方法;方法;当使用当使用re.finall()的时候,在模块内部自动先调用了的时候,在模块内部自动先调用了_compile

22、()方方法,再调用法,再调用findall()方法。方法。re.findall()自带自带pile()的功能,所的功能,所以没有必要使用以没有必要使用pile()。Python3中正则表达式模块的源代码的入口文件为中正则表达式模块的源代码的入口文件为re.py。这。这个文件里面的注释就是学习个文件里面的注释就是学习Python正则表达式模块非常好的文档,正则表达式模块非常好的文档,它包含了正则表达式各种符号的简单说明和这个模块内部各个方它包含了正则表达式各种符号的简单说明和这个模块内部各个方法的使用,如图法的使用,如图3-8所示。所示。图图3-8 Python re.py文件自带的文档文件自带

23、的文档 2先抓大再抓小先抓大再抓小 一些一些无效内容和有效内容可能具有相同的规则。这种情况无效内容和有效内容可能具有相同的规则。这种情况下很容易把有效内容和无效内容混在一起,如下面这段文字:下很容易把有效内容和无效内容混在一起,如下面这段文字:有效有效用户用户:姓名姓名:张三张三 姓名姓名:李四李四 姓名姓名:王王五五 无效用户无效用户:姓名姓名:不知名的小虾米不知名的小虾米 姓名姓名:隐身的张大侠隐身的张大侠 有效有效用户和无效用户的名字前面都以用户和无效用户的名字前面都以“姓名姓名:”开头,如果开头,如果使用使用“姓名姓名:(.*?)n”来进行匹配,就会把有效信息和无效信息来进行匹配,就会

24、把有效信息和无效信息混在一起,难以区分,如图混在一起,难以区分,如图3-9所示。所示。图图3-9 使用使用“姓名姓名:(.*?)n”导致有效内容导致有效内容和和无效内容混在无效内容混在一起一起 要要解决这个问题,就需要使用解决这个问题,就需要使用先抓大再抓小的技巧。先把有效用先抓大再抓小的技巧。先把有效用户这个整体匹配出来,再从有效用户这个整体匹配出来,再从有效用户里面匹配出人名,代码和运行效户里面匹配出人名,代码和运行效果如图果如图3-10所示。先抓大再抓小的所示。先抓大再抓小的思想会贯穿整个爬虫开发过程,一思想会贯穿整个爬虫开发过程,一定要重点掌握。定要重点掌握。图图3-10 代码和运行效

25、果代码和运行效果 3括号内和括号外括号内和括号外 在在上面的例子中,括号和上面的例子中,括号和“.*?”都是一起使用的,因此可都是一起使用的,因此可能会有读者认为括号内只能有这能会有读者认为括号内只能有这3种字符,不能有其他普通的字种字符,不能有其他普通的字符。但实际上,括号内也可以有其他字符,对匹配结果的影响符。但实际上,括号内也可以有其他字符,对匹配结果的影响如图如图3-11所示。所示。图图3-11 3-11 括号里有无其他字符对匹配结果的影响括号里有无其他字符对匹配结果的影响3 3.2.2 Python Python文件操作文件操作 Python的文件操作涉及对文件的读的文件操作涉及对文

26、件的读/写与编码的处理,是学习写与编码的处理,是学习爬虫的必备知识。爬虫的必备知识。3.2.1 3.2.1 使用使用PythonPython读读/写文本文件写文本文件 使用使用Python来读来读/写文本需要用到写文本需要用到“open”这个关键字。它的这个关键字。它的作用是打开一个文件,并创建一个文件对象。作用是打开一个文件,并创建一个文件对象。使用使用Python打开文件,有两种写法。打开文件,有两种写法。l 第第1种方式如下:种方式如下:f=open(文件路径文件路径,文件操作方式文件操作方式,encoding=utf-8)对文件进行操作对文件进行操作f.close()l第第2种方式,使

27、用种方式,使用Python的上下文管理器:的上下文管理器:withopen(文件路径文件路径,文件操作方式文件操作方式,encoding=utf-8)asf:对文件进行操作对文件进行操作 第第1种方式需要手动关闭文件,但是在程序开发中经常会出种方式需要手动关闭文件,但是在程序开发中经常会出现忘记关闭文件的情况现忘记关闭文件的情况。第。第2种种方法不需要手动关闭文件,只要方法不需要手动关闭文件,只要代码退出了缩进,代码退出了缩进,Python就会自动关闭文件。就会自动关闭文件。1使用使用Python读文本文件读文本文件 使用使用Python打开一个文本文件时,首先要保证这个文件是存打开一个文本文

28、件时,首先要保证这个文件是存在的。在读文件的时候,在的。在读文件的时候,“文件操作方式文件操作方式”这个参数可以省略,这个参数可以省略,也可以写成也可以写成“r”,也就是,也就是read的首字母。的首字母。文件文件路径可以是绝对路径,也可以是相对路径。如果是绝对路径可以是绝对路径,也可以是相对路径。如果是绝对路径,路径,Linux和和MacOS不能直接使用不能直接使用“”表示表示“home目录目录”,因为因为Python不认识不认识“”这个符号。如果非要使用这个符号,需这个符号。如果非要使用这个符号,需要使用要使用Python的的“os”模块,代码如下:模块,代码如下:importos rea

29、l_path=os.path.expanduser(/project/xxx)这样这样,Python就会将这种风格的路径转化为就会将这种风格的路径转化为Python能认识的绝能认识的绝对路径。对路径。相对相对路径是文本文件相对于现在的工作区而言的路径,并不总路径是文本文件相对于现在的工作区而言的路径,并不总是相对于当前正在运行的这个是相对于当前正在运行的这个Python文件的路径。在本章中,请读文件的路径。在本章中,请读者直接将文本文件和者直接将文本文件和Python文件放在一起,这样就可以直接使用文文件放在一起,这样就可以直接使用文件名来打开文本文件。件名来打开文本文件。文本文件文本文件的内

30、容和它相对于的内容和它相对于.py文件的位置如图文件的位置如图3-12所示。所示。图图3-12 文本文件的内容和它相对于文本文件的内容和它相对于.py文件的位置文件的位置 使用使用下面的代码来打开下面的代码来打开text.txt文件:文件:withopen(text.txt,encoding=utf-8)asf:通过通过f来读文件来读文件 这里这里有一个参数有一个参数“encoding”。这个参数特别有用,它可以。这个参数特别有用,它可以在打开文件的时候将文件转换为在打开文件的时候将文件转换为UTF-8编码格式,从而避免乱码编码格式,从而避免乱码的出现。这个参数只有的出现。这个参数只有Pyth

31、on3有,在有,在Python2中使用这个参数中使用这个参数会报错。如果文件是在会报错。如果文件是在Windows中创建的,并且使用中创建的,并且使用UTF-8打开打开文件出现了乱码,可以把编码格式改为文件出现了乱码,可以把编码格式改为GBK。文本文件文本文件可以按行读取,可以按行读取,也可以直接读取里面的所有内也可以直接读取里面的所有内容。容。读取读取所有行,并以列表的所有行,并以列表的形式返回结果,代码如下:形式返回结果,代码如下:f.readlines()运行运行效果如图效果如图3-13所示。所示。图图3-13 使用使用readlines()读取文本所有行并以列表形式返回结果读取文本所有

32、行并以列表形式返回结果 直接直接把文件里面的全部内容用一个字符串返回,代码如下:把文件里面的全部内容用一个字符串返回,代码如下:f.read()运行运行结果如图结果如图3-14所示。所示。图图3-14 直接把整个文本内容以一个字符串方式返回的结果直接把整个文本内容以一个字符串方式返回的结果 2使用使用Python写文本文件写文本文件 使用使用Python写文件也需要先打开文件,使用如下代码来打开文件:写文件也需要先打开文件,使用如下代码来打开文件:withopen(new.txt,w,encoding=utf-8)asf:通过通过f来写文件来写文件 这里这里多出来一个参数多出来一个参数“w”,

33、w是英文是英文write的首字母,意思是以的首字母,意思是以写的方式打开文件。这个参数除了为写的方式打开文件。这个参数除了为“w”外,还可以为外,还可以为“a”。它。它们的区别在于,如果原来已经有一个们的区别在于,如果原来已经有一个new.txt文件了,使用文件了,使用“w”会覆会覆盖原来的文件,导致原来的内容丢失;而使用盖原来的文件,导致原来的内容丢失;而使用“a”,则会把新的内,则会把新的内容写到原来的文件末尾。容写到原来的文件末尾。写写文件时可以直接写一大段文本,也可以写一个列表。文件时可以直接写一大段文本,也可以写一个列表。直接直接将一大段字符串写入到文本中,可以使用下面这一行将一大段

34、字符串写入到文本中,可以使用下面这一行代码:代码:f.write(一大段文字一大段文字)把把列表里面的所有字符串写入到文本中,可以使用下面这列表里面的所有字符串写入到文本中,可以使用下面这一行代码:一行代码:f.writelines(第一段话第一段话,第二段话第二段话,第三段话第三段话)需要需要特别注意,写列表的时候,特别注意,写列表的时候,Python写到文本中的文字写到文本中的文字是不会自动换行的,需要人工输入换行符才可以。代码和运行是不会自动换行的,需要人工输入换行符才可以。代码和运行生成的文本生成的文本new.txt如图如图3-15和图和图3-16所示。请注意代码第所示。请注意代码第8

35、行列行列表中的两个字符串,在表中的两个字符串,在new.txt的第的第3行中被拼在了一起。行中被拼在了一起。图图3-15 3-15 写字符串和包含字符串的列表到文本中的代码写字符串和包含字符串的列表到文本中的代码图图3-16 写文本生成的文件内容结果写文本生成的文件内容结果3.2.2 3.2.2 使用使用PythonPython读读/写写CSVCSV文件文件 CSV文件可以用文件可以用Excel或者或者Numbers打开,得到可读性很打开,得到可读性很高的表格,如图高的表格,如图3-17所示。所示。图图3-17 使用使用Numbers打开打开CSV文件文件 CSV文件本质上就是文本文件,但是如

36、果直接用文本编辑器文件本质上就是文本文件,但是如果直接用文本编辑器打开,可读性并不高,如图打开,可读性并不高,如图3-18所示。所示。图图3-18 3-18 直接用文本编辑器打开直接用文本编辑器打开CSVCSV文件文件 Python自带操作自带操作CSV的模块。使用这个模块,可以将的模块。使用这个模块,可以将CSV文文件的内容转换为件的内容转换为Python的字典,从而方便使用。的字典,从而方便使用。1Python读读CSV文件文件 要要读取读取CSV文件,首先需要导入文件,首先需要导入Python的的CSV模块:模块:importcsv 由于由于CSV文件本质上是一个文本文件,所以需要先以文

37、本文文件本质上是一个文本文件,所以需要先以文本文件的方式打开,再将文件对象传递给件的方式打开,再将文件对象传递给CSV模块:模块:withopen(result.csv,encoding=utf-8)asf:reader=csv.DictReader(f)forrowinreader:print(row)运行运行结果图结果图3-19所示。所示。图图3-19 使用使用CSV模块打开模块打开CSV文件文件 代码代码中,中,for循环得到的循环得到的row是是OrderedDict(有序字典),(有序字典),可以直接像普通字典那样使用:可以直接像普通字典那样使用:username=rowuserna

38、me content=rowcontent reply_time=rowreply_time 运行运行结果如图结果如图3-20所示。所示。图图3-20 像读字典一样读像读字典一样读CSV文件文件 短短短短几行代码,已经将几行代码,已经将CSV文件转换为字典了。文件转换为字典了。特别特别注意:注意:读取读取文本内容的代码必须放文本内容的代码必须放在缩进内部进行,否则会导致报在缩进内部进行,否则会导致报错,如图错,如图3-21所示。所示。图图3-21 读取文本内容的代码必须放在缩进的里面读取文本内容的代码必须放在缩进的里面 这这是因为是因为f变量里面的值是一个生成器,生成器只有在被使用变量里面的值

39、是一个生成器,生成器只有在被使用(更准确的说法是被迭代)的时候才会去读文本内容。但是退出(更准确的说法是被迭代)的时候才会去读文本内容。但是退出with的缩进以后,文件就被的缩进以后,文件就被Python关闭了,这个时候当然什么都关闭了,这个时候当然什么都读不了。读不了。那那有没有什么办法可以绕过这个限制呢?当然是有的,那就有没有什么办法可以绕过这个限制呢?当然是有的,那就是使用列表推导式。图是使用列表推导式。图3-22所示为使用列表推导式读取文本内容。所示为使用列表推导式读取文本内容。请对比图请对比图3-21和图和图3-22第第4行的不同。行的不同。图图3-22 使用列表推导式读取文本内容使

40、用列表推导式读取文本内容 2Python写写CSV文件文件 Python可以把一个字典写成可以把一个字典写成CSV文件,或者把一个包含字典文件,或者把一个包含字典的列表写成的列表写成CSV文件。文件。Python写写CSV文件比读文件比读CSV文件稍微复杂一文件稍微复杂一点,因为要指定列名。列名要和字典的点,因为要指定列名。列名要和字典的Key一一对应。一一对应。Python写写CSV文件时需要用到文件时需要用到csv.DictWriter()这个类。它接这个类。它接收两个参数:第收两个参数:第1个参数是文件对象个参数是文件对象f;第;第2个参数名为个参数名为fieldnames,值为字典的,

41、值为字典的Key列表。列表。写入写入CSV文件的列名行:文件的列名行:writer.writeheader()将将包含字典的列表全部写入到包含字典的列表全部写入到CSV文件中:文件中:writer.writerows(包含字典的列表包含字典的列表)写入写入一个包含字典的列表,每一个字典对应一个包含字典的列表,每一个字典对应CSV的一行。这些的一行。这些字典的字典的Key必须和必须和fieldnames相同。字典可以是普通的无序字典,所相同。字典可以是普通的无序字典,所以不需要关心字典里面以不需要关心字典里面Key的顺序,但是不能存在的顺序,但是不能存在fieldnames里面没里面没有的有的K

42、ey,也不能缺少,也不能缺少fieldnames里面已有的里面已有的Key。写入写入单个字典:单个字典:writer.writerow(字典字典)代码代码如图如图3-23所示,运行结果如图所示,运行结果如图3-24所示。所示。MacOS的的Numbers显示显示CSV文件的结果和文件的结果和Excel中显示的结果可能存在差异,但是表格里中显示的结果可能存在差异,但是表格里面的数据应该是一致的。面的数据应该是一致的。图图3-23 将包含列表的字典写入到将包含列表的字典写入到CSV文件中文件中图图3-24 生成的生成的CSV文件用文件用Numbers打开以后的结果打开以后的结果3.3 3.3 阶段

43、案例阶段案例半自动爬虫半自动爬虫开发开发 所谓所谓半自动爬虫,顾名思义就是一半手动半自动爬虫,顾名思义就是一半手动一半自动地进行爬虫,手动的部分是把网页的一半自动地进行爬虫,手动的部分是把网页的源代码复制下来,自动的部分是通过正则表达源代码复制下来,自动的部分是通过正则表达式把其中的有效信息提取出来。式把其中的有效信息提取出来。3.3.1 3.3.1 需求分析需求分析 在百度贴吧中任意寻找一个贴吧并打开一个热门帖子,将在百度贴吧中任意寻找一个贴吧并打开一个热门帖子,将帖子的源代码复制下来,并保存为帖子的源代码复制下来,并保存为source.txt。Python 读入这个读入这个source.t

44、xt文件,通过正则表达式获取用户名、发帖内容和发帖文件,通过正则表达式获取用户名、发帖内容和发帖时间,并保存为时间,并保存为result.csv。涉及的知识点如下。涉及的知识点如下。(1)在浏览器中查看网站的源代码。)在浏览器中查看网站的源代码。(2)使用)使用Python读文本文件。读文本文件。(3)正则表达式的应用。)正则表达式的应用。(4)先抓大再抓小的匹配技巧。)先抓大再抓小的匹配技巧。(5)使用)使用Python写写CSV文件。文件。3.3.2 3.3.2 核心代码构建核心代码构建1在浏览器中获取网页的源代码在浏览器中获取网页的源代码 以以Chrome浏览器为例来说明如何浏览器为例来

45、说明如何查看网页的源代码。在网页上单击鼠查看网页的源代码。在网页上单击鼠标右键,选择标右键,选择“显示网页源代码显示网页源代码”命命令,如图令,如图3-25所示。所示。图图3-25 选择选择“显示网页源代码显示网页源代码”命令命令 网页网页源代码如图源代码如图3-26所示。这里可以复制全部的源代码,并所示。这里可以复制全部的源代码,并粘贴到记事本中。粘贴到记事本中。图图3-26 网页源代码网页源代码 2获取关键信息获取关键信息 要要获取网站的关键信息,就需要观察网页源代码的规律获取网站的关键信息,就需要观察网页源代码的规律。通过通过对比每一层楼的帖子,可以发现规律,即每一层楼都是对比每一层楼的

46、帖子,可以发现规律,即每一层楼都是从从“username”开头的,如图开头的,如图3-27所示。所示。图图3-27 用户名的规律用户名的规律 先先来看用户名,从图来看用户名,从图3-27可以看出,用户名符合这样的规律:可以看出,用户名符合这样的规律:username=(.*?)再来再来看发帖内容,从图看发帖内容,从图3-28可以看出,发帖内容符合如下规可以看出,发帖内容符合如下规律:律:d_post_contentj_d_post_content(.*?)(2017.*?)3.3.3 3.3.3 调试与运行调试与运行 完整的半自动爬虫代码如图完整的半自动爬虫代码如图3-30所示,生成的所示,生

47、成的CSV文件如文件如图图3-31所示。所示。图图3-30 完整的半自动爬虫代码完整的半自动爬虫代码图图3-31 爬虫生成的爬虫生成的CSV文件文件图图3-32 把帖子的每一层楼看作一个块把帖子的每一层楼看作一个块 开始开始和结束标志如图和结束标志如图3-33所所示。示。对对原来的代码进行修改,可原来的代码进行修改,可以得到逻辑更加合理的新代码,以得到逻辑更加合理的新代码,如图如图3-34所示。所示。图图3-33 一层楼的开始和结束标志一层楼的开始和结束标志图图3-34 更合乎逻辑的半自动爬虫代码更合乎逻辑的半自动爬虫代码3.4 3.4 本章本章小结小结 本章本章主要讲到了正则表达式和主要讲到

48、了正则表达式和Python的文件操作。的文件操作。正则表达式正则表达式用来在一大段文字中提取需要的内容,用得最多用来在一大段文字中提取需要的内容,用得最多的组合是的组合是“(.*?)”。这个组合可以解决绝大多数的目标提取问题。这个组合可以解决绝大多数的目标提取问题。使用使用Python读读/写文本文件和写文本文件和CSV文件都需要先把文件打开,文件都需要先把文件打开,在在Python中使用中使用open这个关键字来打开文件。在这个关键字来打开文件。在Python中,使用中,使用CSV这个内置的模块可以非常方便地把这个内置的模块可以非常方便地把CSV文件转换成文件转换成Python的字的字典,或者把典,或者把Python的字典转换为的字典转换为CSV文件。文件。3.5 3.5 动手动手实践实践 在在百度贴吧中寻找一个自己喜欢的贴吧,将其中一篇热门帖百度贴吧中寻找一个自己喜欢的贴吧,将其中一篇热门帖子的每层楼的发帖人、发帖内容和发帖时间抓取下来。子的每层楼的发帖人、发帖内容和发帖时间抓取下来。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第3章-正则表达式与文件操作课件.pptx)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|