python爬蟲之解析庫正則表達式


   上次說到了requests庫的獲取,然而這只是開始,你獲取了網頁的源代碼,但是這並不是我們的目的,我們的目的是解析鏈接里面的信息,比如各種屬性  @href  @class span  抑或是p節點里面的文本內容,但是我們需要一種工具來幫我們尋找出這些節點,總不能讓我們自己一個一個復制粘貼來完成吧,那樣的話,還要程序員干嘛>>計算機是為了方便人們才被發明出來的.

  這次我們使用一個非常好用的工具>>正則表達式,可能有的大佬已經聽說過了,哦,就是那么一個東西,並說,不是用css選擇器或者xpath,beautifulsoup來解析不是更好嗎?當然,我開始的時候也是聽大佬們這么說的,但是再一些簡單的提取信息里,正則表達式的速度確實是最快的,而且有相同的結構的話,構造的表達式更快,關於正則表達式詳解大家可以去百度一下>>正則表達式詳解<<那里有更多的使用方法,我只是總結利用了一些我個人認為比較好用的正則表達式用法.

 例如我們獲取了以下的一個網頁源代碼:

 

 我們想要獲取br節點里面的IP地址,怎么辦呢/我們可以構造表達式   首先我們得了解一下元字符:

  這里說明了匹配得用法,\w就是匹配除了非字符的,例如空格 , $%^.!@#這些全部別省略而過,因為不符合匹配規則,想要匹配空格,就要換成\s  這里我們再了解一下限定符的概念:

  限定符的意思根據我的理解是匹配該符合匹配規則的次數,如果沒有要求,它可能匹配出全部給你,也可能只匹配第一個結果給你,限定符就起到了匹配次數的效果,讓你做到想使用匹配規則多少次就多少次.下面是一些常用的正則表達式:

 

 

   可能大家看的有些疑惑,那是因為你之前沒有接觸過表達式,但是你參照一下上面的規則,再參悟一下,多嘗試匹配,看看錯在哪里,大概堅持一兩天,你就會有一種豁然開朗的感覺,哦,原來是這么一回事啊,我理解一下一個規則用法,比如用戶名的匹配規則:<<   /^是匹配的開始  然后到[a-z0-9  是說匹配從a到z和0到9的所有字符,然后是_-,,它說明在里面可以匹配下划線_和字符- ,{3,16}是匹配從3次到16次,意思是說該用戶可能限制在3到16字節,超過就沒有意義了,多了就會導致提取信息的不純潔性了>>  當然有時候我們想偷懶怎么辦,這些規則有太復雜了,光是構造就得花費很多時間了,這時候,我最喜歡得懶惰限定符出現了,先看規則:

 

       這里可以這樣理解 (.*)是匹配盡可能多的字符串,(.*?)是匹配盡可能匹配少的字符   在python中()表示返回匹配得內容,內容為()里面得字符,如果你想獲取@href的屬性,直接構造為('.*?href="(.*?)" ,h.*?')就可以獲取href的屬性了,不過要記住,它返回的是一個列表的形式,所以你想要實現分行顯示,還要對列表進行遍歷,輸入到文本中,繼而實現簡單的爬取信息.演示如下:

 

 我把我自己寫的源代碼貼出來,可能不是很完善,只是一個很簡單的函數,哪里有缺陷大佬們指出一下

# -*- coding: utf-8 -*-
# author :HXM
from lxml import etree
import requests
import re
from fake_useragent import UserAgent
def page():
        
        ua=UserAgent()

        url=input("請輸入代理網頁:")
        #https://proxy.horocn.com/day-free-proxy/e8ZG.html

        headers={'User-Agent' : ua.random}

        response=requests.get(url,headers=headers)

        if response.status_code==200:
        
                datas=response.text

                pattern=re.compile('.*?<br />(.*?)#.*?<br />',re.S)#re.S表示換行匹配,不受行數限制,python常用pattern來封裝表達式規則,極大方便了調用

                result=re.findall(pattern,datas)

                print(type(result))

                for results in result:

                        with open ("ip.txt","a",encoding="utf-8") as f:
                                
                                f.write("{}\n".format(results))
        return None
page()

 

  這里還要說一個重要的匹配方式,是python中獨有的

  import re  #表示導入正則表達式

  re.match表示是從第一字符開始匹配,如果規則沒有從第一個字符開始表示,盡管你想要的信息就在HTML里面,你也匹配不出來

  re.search表示只匹配符合規則的第一字符並返回結果,對匹配限定符規則是無效的,即不遵守限定匹配次數

  re.findall表示匹配所有符合規則的字符,遵守限定次數規則,最常用的匹配re庫函數

   好了,正則表達式就介紹到這里,不過這只是皮毛而已,不過對我們目前應該是夠用的,后面還有零斷寬言等,大家有興趣可以了解一下>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM