1. 程式人生 > 實用技巧 >006 Python網路爬蟲與資訊提取 資訊組織與提取方法

006 Python網路爬蟲與資訊提取 資訊組織與提取方法

[A] 資訊標記的三種形式

    資訊標記:通過網路爬蟲,我們可以獲取各式各樣的資訊,比如地址資訊,姓名資訊,日期資訊,年代資訊等,這些資訊會很冗雜

         通過對資訊的標記,可以幫助我們更好的組織和管理這些資訊

    資訊標記的好處:

        1. 標記後的資訊可形成資訊組織結構,增加了資訊維度

        2. 標記後的資訊可用於通訊,儲存和展示

        3. 標記的結構和資訊一樣具有重要價值

        4. 標記後的資訊更利於程式的理解和運用

    國際公認的資訊表達種類有三種:

        1. JSON  JavaScript Object Notation,即 JavaScript物件標記

            鍵和值均必須為字串型別

          基本格式:通過有型別的鍵值對構建的物件

            {"name": "汕頭大學"}

          一個鍵對應多個值時:採用陣列格式

            {"name": ["汕頭大學", "深圳大學"]}

          可以進行巢狀

        2. XML  eXtensible Markup Language,即可拓展的標記性語言

          基本格式:類似於html語言格式

            <img arc = "china.jpg" size = 10>這是一張圖片</img>

          無標籤內容時:

            <img arc = "china.jpg" size = 10 />

          註釋資訊:

            <!-- 註釋內容 -->

        3. YAML  YAML Ain't Markup Language

            鍵和值都沒有雙引號,即鍵和值都是無型別的

          基本格式:無型別的鍵值對

            name: "汕頭大學"

          巢狀關係組成:通過縮排表示

            name:

              newName: "汕頭大學"

              oldName: "汕頭市扶貧委員會"

          表達並列關係: 對應於JSON中的陣列

            name:

              -"汕頭大學"

              -“汕頭市扶貧委員會”

          資料塊資訊表達:

              當一個鍵的值為一大段話的時候,需要換行

              用|表示整塊資料,用 # 添加註釋資訊

            text: |  # 學校介紹

            汕頭大學(Shantou University),位於廣東省汕頭市,是教育部、廣東省、李嘉誠基金會三方共建的省部共建大學,

            也是全球唯一一所由私人基金會——李嘉誠基金會持續資助的公立大學;入選廣東省“211工程”建設高校、廣東省高水

            平大學重點學科建設高校、教育部卓越工程師教育培養計劃、教育部卓越醫生教育培養計劃、國家級大學生創新創業

            。。。。。。

    三種資訊標記形式的比較:

        XML  最早的通用資訊標記語言,可拓展性好,但是比較繁瑣        適用於Internet上的資訊互動和傳遞

        JSON  資訊有型別,適合程式處理(js),較XML簡潔             適用於雲端和節點的資訊通訊,無註釋

        YAML  資訊無型別,文字資訊比列最高,可讀性好             適用於各類系統的配置檔案,有註釋易讀

[B] 資訊提取的方法

      資訊提取指的是從標記後的資訊中心提取所關注的內容

    資訊提取的一般方法:

      1. 完整的解析資訊的標記形式,再提取關鍵資訊

          XML  JSON  YAML

          使用到的標記直譯器,如bs4庫的標籤樹遍歷

        優點:資訊表達準確

        缺點:提取過程繁瑣,速度慢,需要程式設計師對所分析資訊的結構和內容有清晰的認識和理解

      2. 無視標記形式,直接搜尋關鍵資訊

          通過查詢函式直接查詢文字資訊即可

        優點:提取過程簡潔,速度快

        缺點:提取結果與提取內容相關

      3. 融合方法: 結合形式解析和搜尋方法,提取關鍵資訊

    例項:提取HTML中所有的URL連結

      思路:

          1. 搜搜所有的<a>標籤

          2. 解析<a>標籤格式,提取href後的連結內容

      示例程式碼:

import requests
from bs4 import BeautifulSoup

# 1. 爬取相關內容
r = requests.get('http://python123.io/ws/demo.html')
demo = r.text

# 2. 煲湯
soup = BeautifulSoup(demo, 'html.parser')
# print(soup)

# 3. 提取HTML中所有的URL連結
for link in soup.find_all('a'):
    print(link.get('href'))
print('列印完了')
View Code

[C] 基於bs4庫的HTML內容查詢方法

    BeautifulSoup類返回的soup物件存在一些方法:

      1. soup.find_all(name, attr, recursive, string, **kwargs)

          返回值:列表型別,儲存查詢的結果

          引數:

            name: 對標籤型別的檢索字串,如'a', 'p'

                若要檢索多個標籤的name為陣列 ['a', 'p']      

                若要查詢文件下的所有標籤,則name為True

                若要檢索更復雜的,name也可以為正則表示式

            attrs:對標籤屬性值的檢索字串,可標註屬性檢索

               為字串時,直接寫入標籤屬性值即可

               為鍵值對時,寫全即可,如id='link1'

            recursive: 是否對子孫節點進行搜尋,預設為True

               如果為False,表示只在子節點這一層查詢

            string: <>..</>標籤之間的檢索字串

               如:string='Advanced Python'

                注:該方法只有當標籤中的內容完整的寫在string中時才會搜尋成功,若要部分匹配可使用正則表示式

         find_all()方法由於太過於常用,因此存在簡寫方式:

            1. <tag>.find_all() 可簡寫為 <tag>()

            2. soup.find_all() 可簡寫為 soup()