python爬虫开发:从入门到实战学习笔记(二)正则表达式与文件操作

(1)正则表达式的基本符号。

(2)如何在Python中使用正则表达式。

(3)正则表达式的提取技巧。

(4)Python读写文本文件和CSV文件。


1、正则表达式

在一万个人里面找一个人很困难,但是在一万个人里面找一个非常“有特点”的人却很容易。假设有一个人,皮肤是绿色的,身高三米,那么即使这个人混在一万人中,其他人也能一眼找到他。这个“寻找”的过程,在正则表达式中叫作“匹配”。

使用正则表达式有如下步骤。(1)寻找规律。(2)使用正则符号表示规律。(3)提取信息。

        1、基本符号

                点号 "."  除换行符外任意一个字符

                星号 "*" 前面一个子表达式0次到无限次  一串字符串".*"

                问号 "?" 前面的子表达式0次或无数次   组合".*?"

                反斜杠 "\" 转义字符

                数字 "\d" 表示一位数字digital   表示多位用"\d*"

                小括号"()" 从一段字符串中“提取”出一部分的内容

        2、在Python中使用正则表达式

                模板导入 import re

                1.findall 

                        以列表的形式返回所有满足要求的字符串。

                        函数原型:re.findall(pattern, string, flags=0)

                        pattern表示正则表达式,string表示原来的字符串,flags表示一些特殊功能的标志。

                 2.search

                        只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。

                        原型:re.search(pattren, string, flags=0)

                  3. ".*" 和 ".*?" 的区别

                        .*?这3个符号大多数情况下一起使用。

                        “.*”:贪婪模式,获取最长的满足条件的字符串。

                        “.*? ”:非贪婪模式,获取最短的能满足条件的字符串。

                        

        3、正则表达式提取技巧

                1.不需要compile  使用findall()时调用了compile()

                2.先抓大再抓小  把有效的整体提取出来再匹配

                3.示例 result_1 = re.findall('姓名:(.*?)\n', string_1)

2、读写文本文件和CSV

with open('文件路径' , ' 文件操作方式' , encoding=' utf-8') as f:

        对文件操作

f.readlines()  读取文本所有行并以列表形式返回

f.read() 直接把文件里面的内容用一个字符串返回

f.write("一大段文字") 直接将一大段字符串写入到文本中

 

3、案例——半自动化爬虫开发

在百度贴吧中任意寻找一个贴吧并打开一个热门帖子,将帖子的源代码复制下来,并保存为source.txt。Python读入这个source.txt文件,通过正则表达式获取用户名、发帖内容和发帖时间,并保存为result.csv

(1)在浏览器中查看网站的源代码。(2)使用Python读文本文件。(3)正则表达式的应用。(4)先抓大再抓小的匹配技巧。(5)使用Python写CSV文件。

import re
import csv

with open('流金岁月.txt', encoding='utf-8') as f:
    source = f.read()

result_list = []
username_list = re.findall('username="(.*?)"', source, re.S)
content_list = re.findall('clearfix" style="display:;">(.*?)</div><br>', source, re.S)
reply_time_list = re.findall('date&quot;:&quot;(.*?)&quot;', source, re.S)
print(username_list)
print(content_list)

for i in range(len(username_list)):
    result = {'username': username_list[i],
              'content': content_list[i],
              'reply_time': reply_time_list[i]}
    result_list.append(result)

with open('tieba.csv', 'w', encoding='UTF-8') as f:
    writer = csv.DictWriter(f, fieldnames=['username', 'content', 'reply_time'])
    writer.writeheader()
    writer.writerows(result_list)

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木灬U6770

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值