天天看點

1.python爬蟲基礎——正規表達式

#python網絡爬蟲
#通用網絡爬蟲(沒有目的,爬去所有的URL)  聚焦網絡爬蟲(過濾無關的連結)

#python資料分析與挖掘實戰的正規表達式
#正規表達式  世界上資訊非常多,而我們關注的資訊有限。假如我們希望隻提取出關注資料,此時可以通過一些表達式進行提取,正規表達式就是其中一種進行資料篩選的表達式。

#原子
#原子是正規表達式中最基本的組成機關,每個正規表達式中至少要包含一個原子。
#常見的原子類型有:普通字元作為原子,非列印字元作為原子,通用字元作為原子,原子表

import re
pat="yue"         #普通字元作為原子
string="http://yum.iqianyue.com"
rst=re.search(pat,string)
print(rst)

pat1="\n"  #\n  \t            #非列印字元作為原子
string1='''dsfjsdjf
sdfsdfsdfsdf'''
rst1=re.search(pat1,string1)
print(rst1)

pat2="\w\dpython\w"
#\w 通用字元,比對任意字母,數字,下劃線
#\d 比對任意一個十進制數       #\S 除了十進制數的任意
#|s 比對空白字元       #\S 除了空白字元的任意字元
#\W 比對任意一個除了字母,數字,下劃線的東西
string2="hsdlfsga7pythonkdfshdskjf"
rst2=re.search(pat2,string2)
print(rst2)

pat3="pyth[jsz]n"           #原子表  定義一組平等的字元
string3="fsdjfpythjnjslkdfpythsnjfsjpythjsnfsd"
rst3=re.search(pat3,string3)
print(rst3)

#元字元
#正規表達式中具有一些特殊含義的字元,比如重複N次前面的字元等
#. 比對任意字元
#^ 比對字元串中的開始位置
#$ 比對字元串中結束的位置
#* 比對0次 1次或者多次的前面的原子
#?比對0次或者1次前面的原子
#+ 比對一次或多次前面的原子
#{3} 前面的原子恰好出現了3次  并且連在一起的
#{n} 出現了n次
#{4,7} 至少出現4次  之多出現7次  {4,}
#t|s  出現t或者s
#() 提取某一個内容
pat4=".python..."
string4="sjslkdjfpythonslfjshf"
rst4=re.search(pat4,string4)
print(rst4)

pat5="python|php"
string5="jfsdjphpjsljfspythonfsd"
rst5=re.search(pat5,string5)
print(rst5)

#模式修正符
#可以在不改變正規表達式的情況下,通過模式修正符改變正規表達式的含義,進而實作一些比對結果的調整等功能
#I 使正規表達式不區分大小寫
#M 多行比對
#L 本地化識别比對
#U 根據Unicode解析字元
#S 讓點也能比對包括換行符
pat6="python"
pat7="python"
string6="sjljfaljafPythonsfjlsjfssfs"
rst6=re.search(pat6,string6)
print(rst6)

rst7=re.search(pat7,string6,re.I)    #模式修正符執行個體,不區分大小寫
print(rst7)

#貪婪模式和懶惰模式
#貪婪模式盡可能的多的去比對   #懶惰模式盡可能少的去比對
pat8="p.*y"   #貪婪模式 更多的去覆寫
pat9="p.*?y"  #懶惰模式 更精準的定位
string8="jlsjfhspythonslfjshdpy"
rst8=re.search(pat8,string8)
rst9=re.search(pat9,string8)
print(rst8)
print(rst9)

#正規表達式函數
#正規表達式函數有re.match()函數,re.search()函數,全局比對函數,re.sub()函數
#re.search()  從字元串中搜尋出來
#re.match()   從頭開始比對,如果一開始沒有,那麼就傳回None
#全局比對函數
#re.sub()     主要用于替換

string10="phskfhskjhfkjshfjksgjfyskjhfksdh"
rst10=re.match(pat8,string10)
print(rst10)

rst11=re.compile(pat8).findall(string10)   #全局搜尋函數  顯示所有滿足條件的  後面用的最多
print(rst11)

#常見正規表達式執行個體
#比對.com .cn網址
pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
string='<a href="http://www.baidu.com">fjsljflds</a>'
rst=re.compile(pat).findall(string)
print(rst)

#簡單的爬蟲,如何爬取csdn某個課程頁面上的QQ群
pat="<p>(\d*?)</p>"
import urllib.request
data=urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/215").read()
rst=re.compile(pat).findall(str(data))
print(rst)

#作業:如何爬取豆瓣出版社清單并寫入檔案中
#豆瓣網址:https://read.douban.com/provider/all
import urllib.request
import re

data=urllib.request.urlopen("https://read.douban.com/provider/all").read()
data=data.decode("utf-8")
pat='<div class="name">(.*?)</div>'
mydata=re.compile(pat).findall(data)
print(mydata)
fh=open("/Users/xubin/myapp/pythonfile/出版社file4.txt","w")
for i in range(0,len(mydata)):
    fh.write(mydata[i]+"\n")
fh.close()