1. 程式人生 > >信息組織與提取方法

信息組織與提取方法

處理 range 運行 註釋 北京 main ever children -c

信息組織與提取方法

? 標記後的信息可形成信息組織結構,增加了信息的維度

? 標記的結構與信息一樣具有重要價值

? 標記後的信息可用於通信、存儲或展示

? 標記後的信息更利於程序理解和應用

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

結果截圖:

技術分享圖片

信息組織與提取方法