1. 程式人生 > >python網絡爬蟲與信息提取——5.信息組織與提取方法

python網絡爬蟲與信息提取——5.信息組織與提取方法

num odin yaml exce 基於 blog all plt markup

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.中國大學排名爬蟲實例

  1. #CrawUnivRankingB.py
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import bs4
  5. def getHTMLText(url):
  6. try:
  7. r = requests.get(url, timeout=30)
  8. r.raise_for_status()
  9. r.encoding = r.apparent_encoding
  10. return r.text
  11. except:
  12. return ""
  13. def fillUnivList(ulist, html):
  14. soup = BeautifulSoup(html, "html.parser")
  15. for tr in soup.find(‘tbody‘).children:
  16. if isinstance(tr, bs4.element.Tag):
  17. tds = tr(‘td‘)
  18. ulist.append([tds[0].string, tds[1].string, tds[3].string])
  19. def printUnivList(ulist, num):
  20. tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
  21. print(tplt.format("排名","學校名稱","總分",chr(12288)))
  22. for i in range(num):
  23. u=ulist[i]
  24. print(tplt.format(u[0],u[1],u[2],chr(12288)))
  25. def main():
  26. uinfo = []
  27. url = ‘https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html‘
  28. html = getHTMLText(url)
  29. fillUnivList(uinfo, html)
  30. printUnivList(uinfo, 20) # 20 univs
  31. main()

python網絡爬蟲與信息提取——5.信息組織與提取方法