python爬蟲中的三種常見解析網頁數據的方式

今天對解析網頁數據最為常見三種方式進行介紹:分別是Beautiful、正則表達式和xpath。其中xpath最為常用,也最為方便


1 BeautifulSoup

python爬蟲中的三種常見解析網頁數據的方式

基本知識點:

bs4進行數據解析

-數據解析的原理:

1.標籤定位

2.提取標籤,標籤屬性中存儲的數據值

-bs4數據解析的原理:

1.實例化一個BeautifulSoup對象,並將頁面源碼數據加載在該對象中

2.通過調用BeautifulSoup對象中相關屬性或者方法進行標籤定位和數據提取

-環境安裝:

pip install bs4

- 如何實例化BeautifulSoup對象:

- from bs4 import BeautifulSoup

- 對象的實例化:

- 1. 將本地的html文檔中的數據加載到該對象中

- 2. 將互聯網獲取的頁面源碼加載到該對象中

- 提供的用於數據解析的方法與屬性:

- soup.tagName:返回的是文檔中第一次出現的tagName對應的標籤(tagName為網頁中的標籤名)

- soup.find('tagName') 返回的也是文檔中第一次出現的tagName對應的標籤

注:find('tagName')中可以包含多個tagName參數,使得能被準確定位到

- soup.find_all('tagName') 返回的是文檔中所有tagName部分(注:中間同樣可以包含多個tagName)

- soup.select('某種選擇器(id,class,標籤...選擇器)'),返回的是一個列表

-層級選擇器:

> 表示的是一個層級

空格表示的是多個層級

- 獲取標籤之間的文本數據:

-soup.a.text/string/get_text()

-text/get_text() 可以獲取一個標籤中所有的文本內容

-string 只可以獲得該標籤下直系的文本內容

- 獲取標籤中的屬性值:

-soup.a['href']

爬取任務:詩詞名句網中的《三國演義》全文

網頁顯示如下:

python爬蟲中的三種常見解析網頁數據的方式

代碼示例:

<code>from bs4 import BeautifulSoup
import requests
if __name__ == '__main__':
   # 解析網頁所有內容
    url = "http://www.shicimingju.com/book/sanguoyanyi.html"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/75.0.3770.100 Safari/537.36 '
    }
    page_text = requests.get(url=url,headers=headers).text
   # 解析網頁上需要的東西(即章節詳情頁鏈接和章節標題)
    soup = BeautifulSoup(page_text,'lxml')
    li_list = soup.select('.book-mulu > ul > li')
    fp = open('./三國演義.txt', 'w', encoding='utf-8')
    for li in li_list:
        # mile = []
        title = li.a.string
        href = li.a['href']
        page_text2 = requests.get(url="http://www.shicimingju.com"+href, headers=headers).text
        # print(page_text2)
        soup2 = BeautifulSoup(page_text2, 'lxml')
        p_list = soup2.find('div',class_="chapter_content")
        content = p_list.text
        #print(content)
        fp.write(title+":"+content+'\n')
        print(title,"爬取成功")/<code>

結果顯示:

python爬蟲中的三種常見解析網頁數據的方式


2 正則表達式

python爬蟲中的三種常見解析網頁數據的方式

基本知識點


  • 字符
    • [ab5@]
      匹配"a"或"b"或"5"或"@"
    • [^abc]
      匹配a、b、c之外的任意字符
    • [f-k]
      匹配“f"到"k"之間的字符
    • [^A-F0-3]
      匹配“A"-"F","0"-"3"之外的任意一個字符
    • \d
      任意一個數字,0~9
    • \w
      任意一個字母、數字、漢字或下劃線,A~Z、a~z、0~9、_和任意一個漢字
    • \s
      任意空白符,包括空格、製表符、換行符
    • .
      小數點可以匹配任意一個字符,換行除外(如果要匹配包括"\n"在內的所有字符,一般用[\s\S])
    • 普通字符:字母、數字、漢字、下劃線,匹配與之相同的一個字符
    • 簡單轉義字符:\n(換行),\t(製表),\\(\本身)和 \^...(\^等有特殊作用的符號如要匹配自己的話要用轉義)
    • 標準字符集合
      注意區分大小寫,大寫是相反的意思,匹配相反是不匹配
    • 自定義字符集合
      [ ]方括號匹配方式,能夠匹配方括號中的任意一個字符,^表示取反
  • 量詞(Quantifier)
    修飾前面的一個表達式,如果要修飾多個表達式,就用( )把表達式包起來
    • 貪婪模式 (默認)
      匹配符合的最長的字符串
    • 非貪婪模式 (在量詞後面加 ? 例:{m,n}? )
      匹配符合的最短的字符串
    • {n}
      表達式重複n次
    • {m,n}
      表達式至少重複m次,最多重複n次
    • {m,}
      表達式至少重複m次
    • ?匹配表達式0或1次,相當於{0,1}
    • +表達式至少出現一次,相當於{1,}
    • *表達式不出現或出現任意次,相當於{0,}
python爬蟲中的三種常見解析網頁數據的方式

圖源:百度

爬取任務:糗圖百科中的“熱圖”

網頁顯示如下:

python爬蟲中的三種常見解析網頁數據的方式

代碼示例:

<code>import requests
import re
import os
if __name__ == '__main__':
    # 創建文件夾,用於存放所有圖片
    if not os.path.exists('./qiutu'):
        os.mkdir('./qiutu')
    baseurl = "https://www.qiushibaike.com/imgrank/page/"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/75.0.3770.100 Safari/537.36 '
    }
    want_img = int(input("你想獲得幾頁圖片:"))
    if 13>= want_img > 0:
        for i in range(1,want_img+1):
            url = baseurl+str(i)
            # 獲取單張網頁
            response = requests.get(url=url,headers=headers)
            page_text = response.text
​
            # 定位解析專門的鏈接位置
            findimg = re.compile(r'', re.S)
            img = re.findall(findimg,page_text)  # 注意findall 的前面為re正則,後面為範圍
            for j in img:
                scr="https:"+j  #真正的圖片鏈接
                img_data = requests.get(url=scr,headers=headers).content  # 生成圖片
                # 生成圖片名稱
                img_name = scr.split('/')[-1]  # 以圖片鏈接最後的部分作為名字
                # 圖片存儲的路徑
                img_path = './qiutu/'+img_name
                with open(img_path,'wb')  as fp:
                    fp.write(img_data)
                    print(img_name,"下載成功")
        print("一共有%d張"%(len(img)*want_img))
    else:
        print('對不起,鐵汁,沒這麼多頁圖') 

.*?', re.S) img = re.findall(findimg,page_text) # 注意findall 的前面為re正則,後面為範圍 for j in img: scr="https:"+j #真正的圖片鏈接 img_data = requests.get(url=scr,headers=headers).content # 生成圖片 # 生成圖片名稱 img_name = scr.split('/')[-1] # 以圖片鏈接最後的部分作為名字 # 圖片存儲的路徑 img_path = './qiutu/'+img_name with open(img_path,'wb') as fp: fp.write(img_data) print(img_name,"下載成功") print("一共有%d張"%(len(img)*want_img)) else: print('對不起,鐵汁,沒這麼多頁圖')

結果顯示:

python爬蟲中的三種常見解析網頁數據的方式


3 xpath

python爬蟲中的三種常見解析網頁數據的方式

基本知識點:

xpath解析:最常用也是最便捷高效的一種解析方式,具有通用性。

-xpath解析原理:

-1.實例化一個etree的對象,且將需要被解析的頁面源碼數據加載到該對象中

-2.調用etree對象中的xpath方法,結合著xpath表達式實現標籤的定位以及內容的捕獲。

- 環境的安裝:

- pip install lxml

- 如何實例化一個etree對象

-1.將本地的html文檔中的源碼數據加載到該對象中

etree.parse(filePath)

-2.可以將從互聯網上獲取的源碼數據加載到該對象中

etree.HTML('page_text')

- xpath('xpath表達式')

-xpath表達式

- .: 選取當前節點

- /:表示的是一個層級,從根節點開始定位

- //:表示的是多個層級。可以表示從任意位置開始定位

- 屬性定位://tag[@屬性='']

- 索引定位://tag[@屬性='']/p[3] 索引是從1開始的

- 取文本:

- /text() 獲取的是標籤中直系的文本內容

- //text() 獲取的是標籤中非直系的文本內容(標籤中所有的文本內容)

- 取屬性:

- /@attrName ==>img/src



xpath方式爬取將在接下來的爬取案例中呈現



- END -

python爬蟲中的三種常見解析網頁數據的方式


python爬蟲中的三種常見解析網頁數據的方式

讀書、觀影

分享生活的碎片


有理想的人不會傷心

收藏

舉報

李的讀書觀影筆記Loading.../<code>


分享到:


相關文章: