python網絡爬蟲與信息提取——5.信息組織與提取方法
1.信息標記的三種形式
(1)XML(eXtensible Markup Language)可擴展標記語音
<name> … </name>有內容的標簽
<name />無內容的標簽
<!‐‐ ‐‐>註釋
(2)JSON(JavsScript Object Notation)有類型的鍵值對 key:value
“key” : “value”
“key” : [“value1”, “value2”]多值用[,]組織
“key” : {“subkey” : “subvalue”}鍵值對嵌套用{,}
(3)YAML(YAML Ain’t Markup Language)無類型鍵值對 key:value
縮進表達所屬關系
‐ 表達並列關系
| 表達整塊數據 # 表示註釋
key : value
key : #Comment
‐value1
‐value2
key :
subkey : subvalue
2.比較
XML
最早的通用信息標記語言,可擴展性好,但繁瑣
Internet上的信息交互與傳遞
JSON
信息有類型,適合程序處理(js),較XML簡潔
移動應用雲端和節點的信息通信,無註釋
YAML
信息無類型,文本信息比例最高,可讀性好
各類系統的配置文件,有註釋易讀
3.信息提取的一般方法
方法一:完整解析信息的標記形式,再提取關鍵信息
優點:信息解析準確
缺點:提取過程繁瑣,速度慢
方法二:無視標記形式,直接搜索關鍵信息
優點:提取過程簡潔,速度較快
缺點:提取結果準確性與信息內容相關
融合方法:結合形式解析與搜索方法,提取關鍵信息
需要標記解析器及文本查找函數
4.基於bs4庫的html內容查找方法
<>.find_all(name, attrs, recursive, string, **kwargs)
返回一個列表類型,存儲查找的結果
? name : 對標簽名稱的檢索字符串
? attrs: 對標簽屬性值的檢索字符串,可標註屬性檢索
? recursive: 是否對子孫全部檢索,默認True
? string: <>…</>中字符串區域的檢索字符串
<tag>(..) 等價於 <tag>.find_all(..)
soup(..) 等價於 soup.find_all(..)
擴展方法:
<>.find() 搜索且只返回一個結果,同.find_all()參數
<>.find_parents() 在先輩節點中搜索,返回列表類型,同.find_all()參數
<>.find_parent() 在先輩節點中返回一個結果,同.find()參數
<>.find_next_siblings() 在後續平行節點中搜索,返回列表類型,同.find_all()參數
<>.find_next_sibling() 在後續平行節點中返回一個結果,同.find()參數
<>.find_previous_siblings() 在前序平行節點中搜索,返回列表類型,同.find_all()參數
<>.find_previous_sibling() 在前序平行節點中返回一個結果,同.find()參數
4.中國大學排名爬蟲實例
- #CrawUnivRankingB.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):
- 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 = ‘https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html‘
- html = getHTMLText(url)
- fillUnivList(uinfo, html)
- printUnivList(uinfo, 20) # 20 univs
- main()
python網絡爬蟲與信息提取——5.信息組織與提取方法