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")

猜你喜欢

转载自blog.csdn.net/IT_arookie/article/details/82821976
今日推荐