爬虫之re 正则表达式的用法

正则表达式是通过特殊的字符序列,实现字符串的检索、替换、匹配验证。在爬虫时,使用正则表达式可以方便我们快速提取到HTML中的信息

书写规则

在这里插入图片描述

项目Value
[abc]abc中的一个
[a-z]a-z中的一个
[0-9]0-9中的一个
[a-f0-5]a-f或0-5中的一个
[ab][de][12]每个[]取一个,连起来

match()

从字符串的开头开始对整个字符串进行匹配,一但开头匹配不成功就报错,如果不匹配,返回None

import re

content = 'id:5874268 zwdashuaige'
ret = re.match('id:\w{7}',content)
print(ret.group())
#print(ret)

输出结果:

id:5874268
#<re.Match object; span=(0, 10), match='id:5874268'>

我们写定义了一个字符串content,包含字母、空格、数字、冒号。然后通过’id:\w{7}'来匹配这个字符串,id是匹配的开头,\w’表示匹配字母、数字、下划线,{7}表示匹配7个字符

import re

content = 'id:5874268 zwdashuaige'
ret = re.match('\w{2}:\d{7}\s\w+',content)
print(ret.group())

输出结果:

id:5874268 zwdashuaige

但这些用\w \d都非常麻烦,我们可以直接用万能匹配的方式 .* ,分别表示匹配任意字符(除换行符)和无限个字符,结合在一起就是匹配任意个字符

import re

content = 'id:5874268 zwdashuaige'
ret = re.match('id.*e',content)
print(ret.group())

输出结果

id:5874268 zwdashuaige

匹配到的都是引号内的内容,如果我们只要部分内容,可以用把想要的内容放在括号内,括号()代表开始和结束的位置,同时每个括号代表一个分组,用group(1)、group(2)······的方式传递

import re

content = 'id:5874268 zwdashuaige'
ret = re.match('id.*(\d+)\szw.*?(\w+)',content)
print(ret.group(1))
print(ret.group(2))

输出结果:

8
dashuaige


这里会涉及到贪婪匹配的概念,在贪婪匹配下,.*会匹配尽可能多的字符,所以导致(\d+)只匹配到了一个数字8。这种情况下, 我们可以使用非贪婪匹配. *?,所有的非贪婪匹配加个就行了。 如上述代码

match()还有个参数,可以扩展匹配的范围,不加参数匹配的范围只有一行内容
在这里插入图片描述
例如:

import re

content = '''id:5874268 
zwdashuaige'''
ret = re.match('id.*shuaige',content,re.S)
print(ret.group())

输出结果:

id:5874268 
zwdashuaige

search()

从左到右扫描整个字符串,返回第一个与模式匹配成功的内容

findall()

返回在字符串中找到与模式匹配的所有子串,并返回一个类别,若无匹配的字符串,则返回空列表

import re

html = '''<div id="songs-list">
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
        经典老歌列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
</div>'''

result = re.findall('singer="(\w+).*>(\w+)</a>', html)
print(result)

输出结果:

[('任贤齐', '沧海一声笑'), ('齐秦', '往事随风'), ('beyond', '光辉岁月'), ('陈慧琳', '记事本'), ('邓丽君', '但愿人长久')]

sub

sub()可以用来替换文本,先匹配要替换的字符串,再用另一字符串将它替换,通过count参数来指定替换次数

import re

content = '''zwid5874268 zwdashuaige'''
ret = re.sub('id(\d+)','666',content)
print(ret)

输出结果:

zw666 zwdashuaige

compile()

conmpile() 可以将正则字符串编译成正则表达式对象,以便在后面的匹配中重复使用

import re

content1 = '2019-01-01 12:00'
content2 = '2019-01-02 12:30'
content3 = '2019-01-03 13:00'
pattern = re.compile('(\d+)-(\d+)-(\d+)\s.*')
result_1 = re.match(pattern, content1)
result_2 = re.match(pattern, content2)
result_3 = re.match(pattern, content3)
print('Year:' + result_1.group(1) + '  Month:' + result_1.group(2) + '  Day:' + result_1.group(3))
print('Year:' + result_2.group(1) + '  Month:' + result_2.group(2) + '  Day:' + result_2.group(3))
print('Year:' + result_3.group(1) + '  Month:' + result_3.group(2) + '  Day:' + result_3.group(3))

输出结果:

import re

content1 = '2019-01-01 12:00'
content2 = '2019-01-02 12:30'
content3 = '2019-01-03 13:00'
pattern = re.compile('(\d+)-(\d+)-(\d+)\s.*')
result_1 = re.match(pattern, content1)
result_2 = re.match(pattern, content2)
result_3 = re.match(pattern, content3)
print('Year:' + result_1.group(1) + '  Month:' + result_1.group(2) + '  Day:' + result_1.group(3))
print('Year:' + result_2.group(1) + '  Month:' + result_2.group(2) + '  Day:' + result_2.group(3))
print('Year:' + result_3.group(1) + '  Month:' + result_3.group(2) + '  Day:' + result_3.group(3))

实战

import re
import requests

url = 'https://read.douban.com/provider/all'
# 请求头部伪装
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
response = requests.get(url, headers=headers)
text = response.text
# 正则表达式匹配
result_list = re.findall(r'<div class="name">(.*?)</div>', text, re.DOTALL)
# 输出结果
for result in result_list:
    print(result)

部分结果:

安徽文艺出版社
博集天卷
百花洲文艺出版社
北京阅览文化传播有限公司
八光分文化
重庆大学出版社
读客文化
电子工业出版社
······
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Python 爬虫中,正则表达式是非常常用的工具。它可以帮助我们从网页中抓取需要的信息,过滤掉不需要的内容,提高爬取效率和准确性。以下是一些常用的正则表达式应用场景: 1. 匹配 URL 链接:可以使用正则表达式提取出页面中的所有链接,便于进一步抓取和分析页面内容。 2. 匹配特定文本:如果我们只需要网页中某个特定文本,可以使用正则表达式来匹配并提取。 3. 过滤 HTML 标签:网页中的 HTML 标签对于我们的数据分析来说是无用的,可以使用正则表达式去除标签。 4. 匹配时间日期:有些网站会包含时间日期等信息,可以使用正则表达式来提取这些信息。 Python 中可以使用 re 模块来实现正则表达式的应用。具体使用方法可以参考以下示例代码: ```python import re import requests # 抓取网页内容 r = requests.get('https://www.example.com') html = r.content.decode() # 匹配 URL 链接 urls = re.findall('<a href="(.*?)".*?>.*?</a>', html) print(urls) # 匹配特定文本 text = re.search('<title>(.*?)</title>', html).group(1) print(text) # 过滤 HTML 标签 clean = re.compile('<.*?>') content = re.sub(clean, '', html) print(content) # 匹配时间日期 dates = re.findall('\d{4}-\d{2}-\d{2}', html) print(dates) ``` 上述代码演示了如何使用正则表达式抓取网页内容并进行一些简单的数据处理。需要注意的是,在实际应用中,正则表达式应该根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值