python 爬虫 正则表达式的详细使用

提取 网页内容 四大基本方法之

1.正则表达式 re模块

表达式说明
[abc]abc中的一个
[a-z]a-z中的一个
[0-9]0-9中的一个
[af0-9]a-f,0-9中的一个
[ab][cd][12]三个中分别选出一个来
.任意字符
\.表示真实意义的.
\d表示一个数字,相当于[0-9]
\D一个非数字
\w一个数字字母或下划线[a-zA-Z0-9_]
\W取反面 \w的非
\s空格、空白
\S非空白符
\b单词边界 r’\baaaa\b’ 特殊的地方,单词前一定要加r
{m}m个, a{4} 4个连续的a
{m,n}m—n个, b{2,5}2-5个连续的b
{1,}1个以上
{0,}0个以上
{0,1}0或1次
*相当于{0,}
+相当于{1,}
?相当于{0,1}
^以什么开头 ^a\w{3}
$以什么结尾 \w{3}$
re.S多行匹配模式
re.I忽略大小写
import re
reg = re.compile('is')#规则
str = 'hi is jock'
result = re.search(reg,str)
if re.search(reg,str):
    print("存在is")
print(re.findall(reg,str)[0])

提取文本之贪婪模式和非贪婪模式

import re
#贪婪模式(尽可能的多取)
r = re.compile('a\w*b')
str2 = 'a123ba456ba789b'
result2 = re.findall(r,str2)
print(result2)
#非贪婪模式(加问号,尽可能的少取)
r = re.compile('a\w*?b')
str2 = 'a123b456b789b'
result2 = re.findall(r,str2)
print(result2)

使用正则提取网页文本内容的基本原则:

  • 保留相同的特征,删除唯一的特征
  • 把想要提取的部分用括号括起来再加上.*?-----如(.*?)
  • 要提取的范围两边最好有明显的特征

例1:提取文本

import re
info = '''
肖申克的救赎  / The Shawshank Redemption  / 月黑高飞(港) / 刺激1995(台) [可播放]
导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins /...
1994 / 美国 / 犯罪 剧情
 9.6 1135992人评价
希望让人自由。
'''
#数据提取年份
#方法1
reg_time = re.compile('\d{4}\s')
year = re.findall(reg_time,info)
print(year[0][:4])
#方法2
reg_time1 = re.compile('(\d{4})\s/')  #只提取括号圈的部分
year2 = re.findall(reg_time1,info)
print(year2[0])
#提取导演
reg_daoyan = re.compile('导演:(.*?)主演:',re.S)#多行匹配
director = re.findall(reg_daoyan,info)
print(director[0].strip())  #去除字符串两边的空格

例2:拼接很多带空格的文本

import re
info = '''
小       白        
     在       
  学    习    爬
    虫
'''
res = re.compile('\S*')
result = re.findall(res,info)
text = ''
for each in result:
    if each:
        text = text+each
print(text)

例三:实战,爬取51job职位信息

from urllib import request
import re
url = 'https://search.51job.com/list/020000,000000,0000,00,9,99,%25E4%25BA%25BA%25E5%25B7%25A5%25E6%2599%25BA%25E8%2583%25BD,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=.'
reg_request = request.Request(url) #请求
result = request.urlopen(reg_request)  #返回结果
html = result.read().decode('gbk')  #读取和解码
#正则表达式(要严格遵循原则,表达式不唯一)
reg = re.compile('<div class="el">.*?<a target="_blank" title="(.*?)" href=".*?" onmousedown="">.*?<span class="t2"><a target="_blank" title="(.*?)" href=".*?">.*?</a></span>.*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5">(.*?)</span>.*?</div>',re.S)
res1 = re.findall(reg,html)
# 创建txt文件
with open('mytxt.txt','w',encoding='utf-8') as file:
    for echo in res1:
        for i in echo:
            file.write(i)
        file.write("\n")
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值