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()