信息組織與提取方法
? 標記後的信息可形成信息組織結構,增加了信息的維度
? 標記的結構與信息一樣具有重要價值
? 標記後的信息可用於通信、存儲或展示
? 標記後的信息更利於程序理解和應用
HTML的信息標記:
? 文本,超文本(聲音、圖像、視頻)
HTML通過預定義的<>...</>標簽形式組織不同類型的信息。
信息標記的三種形式:
? XML、JSON、YMAL
XML(eXtensible Markup Language):
空元素的縮寫形式:<img src = "china.jpg" size = "10"/>
註釋書寫形式:<!-- This is a comment , very useful -->
<name>...</name>
<name / >
<!-- -->
XML實例:
JSON(JaveScript Object Notation):
有類型的鍵值對 key : value
多值用[ , ]組織
鍵值對嵌套用{ , }
"name" : {
? "newName" : "北京理工大學",
? "oldName" : "延安自然科學院"
? }
JSON實例:
YAML(YMAL Ain‘t Markup Language) :
無類型鍵值對 key : value
縮進表達所屬關系
name :
? newName : 北京理工大學
? oldName : 延安自然科學院
減號( - )表達並列關系
name :
? -北京理工大學
? -延安自然科學院
|表達整塊數據 #表示註釋
key : value
key : #Comment
-value1
-value2
key :
? subkey : subvalue
YAML實例:
三種信息標記形式的比較:
XML : 最早的通用信息標記語言,可擴展性好,但繁瑣
? Internet上的信息交互與傳遞
JSON : 信息有類型,適合程序處理(js),較XML簡潔
? 移動應用雲端和節點的信息通信,無註釋
YMAL : 信息無類型,文本信息比例最高,可讀性好
? 各類系統的配置文件,有註釋易讀
信息提取:從標記後的信息中提取所關註的內容
方法一:完整解析信息的標記形式,再提取關鍵信息
XML、JSON、YAML, 需要標記解析器,例如:bs4庫的標簽樹遍歷
? 優點:信息解析準確;
? 缺點:提取過程繁瑣,速度慢;
方法二:無視標記形式,直接搜索關鍵信息
搜索 對信息的文本查找函數即可
? 優點:提取過程簡介,速度較快;
? 缺點:提取結果準確性與信息內容相關;
融合方法:結合形式解析與搜索方法,提取關鍵信息
XML、JSON、YAML、搜索, 需要標記解析器及文本查找函數
實例:提取HTML中所有的URL鏈接
? 思路:搜索到所有的<a>標簽;
? 解析<a>標簽格式,提取herf後的鏈接內容;
>>> from bs4 import BeautifulSoup >>> import requests >>> r = requests.get("http://python123.io/ws//demo.html >>> demo = r.text >>> soup = BeautifulSoup(demo,‘html.parser‘) >>>for link in soup.find_all(‘a‘): print(link.get(‘href‘))
運行結果:
<>.find_all (name,attrs,recursive,string,**kwargs)
返回一個列表類型,存儲查找的結果
? name:對標簽名稱的檢索字符串;
? attrs :對標簽屬性值的檢索字符串,可標註屬性檢索;
? recursive : 是否對子孫全部檢索,默認True;
? string : <>...</>中字符串區域的檢索字符串。
>>> soup.find_all(‘a‘) [<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>] >>> soup.find_all([‘a‘,‘b‘]) [<b>The demo python introduces several python courses.</b>, <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
? <tag>(..)等價於<tag>.find_all(..)
? <soup>(..)等價於<soup>.find_all(..)
實例:“大學排名定向爬蟲”
? 輸入:大學排名URL鏈接
? 輸出:大學排名信息的屏幕輸出(排名,大學名稱,總分)
? 技術路線:request-bs4
? 定向爬蟲:僅對輸入URL進行爬取,不擴展爬取。
網址:http://www.zuihaodaxue.com/FieldSCI2016.html
#University rank li.py import requests from bs4 import BeautifulSoup import bs4 def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def fillUnivList(ulist, html): soup = BeautifulSoup(html, "html.parser") for tr in soup.find(‘tbody‘).children: if isinstance(tr, bs4.element.Tag): tds = tr(‘td‘) ulist.append([tds[0].string, tds[1].string, tds[3].string]) def printUnivList(ulist, num): print("{:^10}\t{:^6}\t{:^10}".format("排名","學校名稱","總分")) for i in range(num): u=ulist[i] print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2])) def main(): uinfo = [] url = ‘http://www.zuihaodaxue.com/FieldSCI2016.html‘ html = getHTMLText(url) fillUnivList(uinfo, html) printUnivList(uinfo, 20) # 20 univs main()
運行結果:
爬取2016年世界大學工科排名前二十:
網頁鏈接:http://www.zuihaodaxue.com/FieldENG2016.html
#University Rank import requests from bs4 import BeautifulSoup import bs4 def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def fillUnivList(ulist, html): soup = BeautifulSoup(html, "html.parser") for tr in soup.find(‘tbody‘).children: if isinstance(tr, bs4.element.Tag): # tds = tr(‘td‘) ulist.append([tds[0].string, tds[1].string, tds[3].string]) def printUnivList(ulist, num): tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}" print(tplt.format("排名","學校名稱","總分",chr(12288))) for i in range(num): u=ulist[i] print(tplt.format(u[0],u[1],u[2],chr(12288))) def main(): uinfo = [] url = ‘http://www.zuihaodaxue.com/FieldENG2016.html‘ html = getHTMLText(url) fillUnivList(uinfo, html) printUnivList(uinfo, 20) # 20 univs main()
結果截圖:
信息組織與提取方法