1. 程式人生 > >python 爬蟲 正則表示式的詳細使用

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