<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

  • <button id="2ddn7"><object id="2ddn7"></object></button>
      1. <s id="2ddn7"></s>
        更多課程 選擇中心


        Python培訓

        400-111-8989

        Python爬蟲之快速入門正則表達式

        • 發布:Python培訓
        • 來源:Python教程知識
        • 時間:2018-01-17 15:49

        當完成了網頁html的download之后,下一步當然是從網頁中解析我們想要的數據了。那如何解析這些網頁呢?Python中有許多種操作簡單且高效的工具可以協助我們來解析html或者xml,學會這些工具抓取數據是很容易了。

        說到爬蟲的html/xml解析(現在網頁大部分都是html),可使用的方法實在有很多種,如:

        正則表達式

        BeautifulSoup

        Lxml

        PyQuery

        CSSselector

        其實也不止這幾種,還有很多,那么到底哪一種最好呢?這個很難說,蘿卜白菜各有所愛,這些方法各有特色,只能說選擇一款你用著順手的。博主將會陸續給大家介紹這些好用的解析器,但是本篇從正則表達式開始。

        那是不是只要掌握一種就可以了?用不著會那么多吧。確實,熟練掌握一種也可以完成數據的抓取,但隨著你解析網頁的數量增多,你會發現有時候使用多種方法配合解析網頁會更簡單,高效,因為這些方法各有特色,不同環境下發揮的作用不一樣。因此,建議大家熟練掌握至少兩種為佳,這樣當你面對復雜結構網頁的時候,解析方法會更靈活。

        好了,開始我們的解析之旅吧!

        --------------------------

        正則表達式

        --------------------------

        正則表達式(regular expression)簡稱(regex), 是一種處理字符串的強大工具。它作為一種字符串的匹配模式,用于查看指定字符串是否存在于被查找字符串中,替換指定字符串,或是通過匹配模式查找指定字符串。正則表達式在不同的語言里面,語法也基本是相同的,也就是說學會了一種語言的正則,再學習其它的就很快了。

        其主要的匹配過程是:

        先用正則語法定義一個規則(pattern)

        然后用這個規則與你download的網頁字符串進行對比,根據pattern提取你想要的數據。

        好了,讓我們看看Python正則表達式的語法:

        好亂,看不懂!!!

        別著急,開始都是這樣的(當然會的小伙伴可以直接跳過)。下面看幾個例子,你馬上就學會了。

        --------------------------

        你的第一個正則表達式

        --------------------------

        我們舉一個常遇到的一個例子。比如,一個人的郵箱是這樣的lixiaomei@qq.com,那么我們如何從一大堆的字符串把它提取出來呢?

        根據正則語法,我們可以這樣來定義一個pattern:\w+@\w+\.com

        為什么這么定義呢?讓我們來看看。

        "\w" 的意思是單詞字符[A-Za-z0-9_]。注意是 "單字符串",可以是A-Z或者a-z或者0-9或者_各國語言中的任意一個。

        "+" 匹配前一個字符1次或無限次。那么 "\w+" 組合起來的意思就是匹配一次或無限多次的但字符串[A-Za-z0-9]組合的字符串。

        "@" 是郵箱的特定字符,所以固定不變。

        第二個 "\w+" 與前一個是一個道理,匹配一次或無限次的[A-Za-z0-9]組合的字符串。

        " \. " 的含義是將" . "轉義,因為 " . " 本身也是正則語法中的其中一種,為了真的得到 ".com" 而不是帶有功能的" . ", 所以在前面加上 "\" 轉義字符。

        所以,不論是例子中的 lixiaomei@qq.com,還是其它如xiaoxiao@126.com之類的郵箱,只要符合規則全都可以匹配,怎么樣,簡單吧!

        問題來了,有的郵箱格式可是xiaoxiao@xxx.xxx.com這樣的!這樣的話上面的規則就不能用了。沒錯,上面的規則比較特殊,只能匹配單一格式的郵箱名。那么怎樣設計一個滿足以上兩種格式的pattern呢?看看這個:\w+@(\w+\.)?\w+\.com

        這個又是什么意思?

        \w+@與之前一樣

        (\w+\.)?中的“ ? ”是匹配0次或1次括號分組內的匹配內容,"()" 則表示被括內容是一個分組,分組序號從pattern字符串起始往后依次排列。分組的概念非常重要,在后面 “匹配對象方法” 章節會著重介紹其如何使用。

        \w+\.com與之前一樣

        因為是匹配0次或1次,那么就意味著括號內的部分是可有可無的,所以這個pattern就可能匹配兩種郵箱格式。

        “?”是0次或1次,那么 \w+@(\w+\.)*\w+\.com 模式就更厲害了," * " 可以匹配0次或無限次。

        明白了這個之后,相信你應該對正則表達式有一個概念了,但還有很多種語法以及組合方法需要在實踐中反復練習。這里只介紹Python中正則表達式比較常見的匹配模式,更多內容可參考《Python核心編程》一書,關注公眾號并發送 “學習資料” 便可輕松拿到。

        --------------------------

        re模塊核心函數

        --------------------------

        上面簡單的介紹了正則表達式的pattern是如何設置的,那么下一步我們就可以開始我們的提取工作了。在Python的re模塊中有幾個核心的函數專門用來進行匹配和查找。

        compile()函數

        函數定義: compile(pattern, flag=0)

        函數描述:編譯正則表達式pattern,然后返回一個正則表達式對象。

        為什么要對pattern進行編譯呢?《Python核心編程 》里面是這樣解釋的:

        使用預編譯的代碼對象比直接使用字符串要快,因為解釋器在執行字符串形式的代碼前都必須把字符串編譯成代碼對象。

        同樣的概念也適用于正則表達式。在模式匹配發生之前,正則表達式模式必須編譯成正則表達式對象。由于正則表達式在執行過程中將進行多次比較操作,因此強烈建議使用預編譯。而且,既然正則表達式的編譯是必需的,那么使用預編譯來提升執行性能無疑是明智之舉。re.compile()能夠提供此功能。

        原來是這樣,由于compile的使用很簡單,所以將在以下幾個匹配查找的函數使用方法中體現。

        match()函數

        函數定義: match(pattern, string, flag=0)

        函數描述:只從字符串的最開始與pattern進行匹配,匹配成功返回匹配對象(只有一個結果),否則返回None。

        import res1 = '我12345abcde's2 = '.12345abcde'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'\w.+'# 編譯patternpattern_compile = re.compile(pattern)# 對s1和s2分別匹配result1 = re.match(pattern, s1)result2 = re.match(pattern, s2)print(result1)print(result2)>>> <_sre.SRE_Match object; span=(0, 11), match='我12345abcde'>>>> None

        注意:

        match函數是從最開始匹配的,意思是如果第一個字符就不匹配,那就直接玩完,返回None。

        Python中pattern字符串前面的 " r " 代表了原生字符串的意思。

        問題來了,為什么result1結果有這么多的東西啊?貌似最后一個才是要匹配的對象。這個要怎么提取出來呀?別著急,我們現在得到的是匹配對象,需要用一定的方法提取,我們后面會在《匹配對象的方法》章節來解決這個問題,繼續往下看。

        search()函數

        函數定義: search(pattern, string, flag=0)

        函數描述:與match()工作的方式一樣,但是search()不是從最開始匹配的,而是從任意位置查找第一次匹配的內容。如果所有的字串都沒有匹配成功,返回None,否則返回匹配對象。

        import res1 = '我12345abcde's2 = '+?!@12345abcde'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'\w.+'pattern_compile = re.compile(pattern)result1 = re.search(pattern_compile, s1)result2 = re.search(pattern_compile, s2)print(result1)print(result2)>>> <_sre.SRE_Match object; span=(0, 11), match='我12345abcde'>>>> <_sre.SRE_Match object; span=(4, 14), match='12345abcde'>

        可以看到無論字符串最開始是否匹配pattern,只要在字符串中找到匹配的部分就會作為結果返回(注意是第一次匹配的對象)。

        findall()函數

        函數定義: findall(pattern, string [,flags])

        函數描述:查找字符串中所有(非重復)出現的正則表達式模式,并返回一個匹配列表

        import res1 = '我12345abcde's2 = '+?!@12345abcde@786ty'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'\d+'pattern_compile = re.compile(pattern)result1 = re.match(pattern_compile, s2)result2 = re.search(pattern_compile, s1)result3 = re.findall(pattern_compile, s2)print(result1)print(result2)print(result3)>>> None>>> <_sre.SRE_Match object; span=(1, 6), match='12345'>>>> ['12345', '786']

        上面同時列出了match、search、findall三個函數用法。findall與match和search不同的地方是它會返回一個所有無重復匹配的列表。如果沒找到匹配部分,就返回一個空列表。

        --------------------------

        匹配對象的方法

        --------------------------

        以上re模塊函數的返回內容可以分為兩種:

        返回匹配對象:就是上面如 <_sre.SRE_Match object; span=(0, 5), match='12345'> 這樣的對象,可返回匹配對象的函數有match、search、finditer。

        返回一個匹配的列表:返回列表的就是 findall。

        因此匹配對象的方法只適用match、search、finditer,而不適用與findall。

        常用的匹配對象方法有這兩個:group、groups、還有幾個關于位置的如 start、end、span就在代碼里描述了。

        group方法

        方法定義:group(num=0)

        方法描述:返回整個的匹配對象,或者特殊編號的字組

        import res1 = '我12345+abcde'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'\w+'pattern_compile = re.compile(pattern)# 返回匹配的字符串result1 = re.match(pattern_compile, s1).group()# 返回匹配開始的位置result2 = re.match(pattern_compile, s1).start() # 返回匹配結束的位置result3 = re.match(pattern_compile, s1).end() # 返回一個元組包含匹配 (開始,結束) 的位置result4 = re.match(pattern_compile, s1).span() print(result1)print(result2)print(result3)print(result4)>>> 我12345>>> 0>>> 6>>> (0, 6)

        這樣匹配字符串就提取出來了。

        import res1 = '我12345+abcde'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'(\w+)\+(\w+)'pattern_compile = re.compile(pattern)# 返回匹配的整個字符串result1 = re.match(pattern_compile, s1).group()# 返回匹配的第一個子組字符串result2 = re.match(pattern_compile, s1).group(1)# 返回匹配的第二個子組字符串result3 = re.match(pattern_compile, s1).group(2)print(result1)print(result2)print(result3)>>> 我12345+abcde>>> 我12345>>> abcde

        這里就需要用到我們之前提到的分組概念。

        分組的意義在于:我們不僅僅想得到匹配的整個字符串,我們還想得到整個字符串里面的特定子字符串。

        如上例中,整個字符串是“我12345+abcde”,但是想得到 “abcde”,我們就可以用括號括起來。因此,你可以對pattern進行任何的分組,提取你想得到的內容。

        另外,如果匹配對象時None,那么繼續使用匹配對象方法會報錯AttributeError,因此也建議使用except異常來處理。

        groups方法

        方法定義:groups(default =None)

        方法描述:返回一個含有所有匹配子組的元組,匹配失敗則返回空元組

        import res1 = '我12345+abcde'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'(\w+)\+(\w+)'pattern_compile = re.compile(pattern)# 返回含有所有子組的元組result1 = re.search(pattern_compile, s1).groups()print(result1)>>> ('我12345', 'abcde')

        --------------------------

        re模塊的屬性

        --------------------------

        re模塊的常用屬性有以下幾個:

        其實re模塊的屬性就是函數中的flag參數,以第一個大小寫flag為例:

        import res1 = '我12345+aBCde'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'(\w+)\+(\w+)'pattern_compile = re.compile(pattern, re.IGNORECASE)# 返回一個匹配的列表result1 = re.findall(pattern, s1)print(result1)>>> [('我12345', 'abcde')]

        import res1 = '我12345+aBCde'# pattern字符串前加 “ r ” 表示原生字符串pattern = r'(\w+)\+(\w+)'# 返回一個匹配的列表result1 = re.findall(pattern, s1, re.IGNORECASE)print(result1)>>> [('我12345', 'abcde')]

        這里注意:

        如果我們定義了compile編譯,需要將flag填到compile函數中,否則填到匹配函數中會報錯

        如果沒有定義compile,則可以直接在匹配函數findall中填寫flag

        本篇介紹正則表達式的快速入門方法,關于更多正則表達式的內容可以參考如下鏈接:

        Python官網關于正則表達式的操作:

        https://docs.python.org/2/library/re.html

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:python編程學習方法及技術進階建議
        下一篇:python入門到進階書籍推薦!16本經典python書籍

        Python中類的屬性有哪幾種

        Python語法你知道多少

        Python 中常見的配置文件寫法

        Python爬蟲可以做什么

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        黑龍江省

        吉林省

        河北省

        湖南省

        貴州省

        云南省

        廣西省

        海南省

        青青青草网站免费观看|青青青视频在线观看 超真实强奷视频在线看 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>