python日記——網絡爬蟲之BeautifulSoup庫
- BeautifulSoup庫入門
1、基本使用:
2、BeautifulSoup庫的基本元素
(1)Beautiful Soup庫是解析、遍歷、維護“標籤樹”的功能庫
(2)Beautiful Soup庫的解析器:
(3)BeautifulSoup庫的基本元素:
1)任何存在於HTML語法中的標籤都可以用soup.tag訪問獲得,當HTML文檔中存在多個相同tag對應內容時,soup.tag返回第一個
2)每個tag都有自己的名字,通過tag.name獲取,字符串類型
3)一個tag可以有0或多個屬性,字典類型
4)NavigableString可以跨越多個層次
3、基於bs4庫的HTML內容遍歷方法
(1)Html基本格式:
(2)標籤樹的遍歷方法:
1)下行遍歷:
2)上行遍歷:
3)平行遍歷:
平行遍歷發生在同一個父節點下的各節點間
4、基於bs4庫的HTML格式輸出
(1)bs4庫的prettify()方法
(2).prettify()爲HTML文本<>及其內容增加更加’\n’
(3).prettify()可用於標籤,方法:tag.prettify()
(4)bs4庫將任何HTML輸入都變成utf‐8編碼,Python 3.x默認支持編碼是utf‐8,解析無障礙
- 信息標記與提取方法
1、信息標記的三種形式:
(1)XML:
(2)JSON:
(3)YAML:
2、三種形式的比較:
XML:最早的通用信息標記語言,可擴展性好,但繁瑣,Internet上的信息交互與傳遞
JSON:信息有類型,適合程序處理(js),較XML簡潔,移動應用雲端和節點的信息通信,無註釋
YAML:信息無類型,文本信息比例最高,可讀性好,各類系統的配置文件,有註釋易讀
3、基於bs4的HTML內容查找方法
(1)<>.find_all(name, attrs, recursive, string, **kwargs),返回一個列表類型,存儲查找的結果
tag(…) 等價於 tag.find_all(…)
soup(…) 等價於 soup.find_all(…)
(2)參數詳解:
∙ name : 對標籤名稱的檢索字符串
∙ attrs: 對標籤屬性值的檢索字符串,可標註屬性檢索
∙ recursive: 是否對子孫全部檢索,默認True
∙ string: <>…</>中字符串區域的檢索字符串
(3)擴展方法:
- 中國大學排名實例
#getHtml():通過requests庫獲取大學排名網頁內容
#fillList():提取網頁內容中信息到合適的數據結構
#printList():輸出排名、大學名稱、總分
#saveToExcel():將結果保存到excel
import requests as rq
from bs4 import BeautifulSoup
import pandas as pd
import bs4
def getHtml(url):
try:
r = rq.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fillList(ulist,html):
soup = BeautifulSoup(html,'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
#判斷tr是否是tag類型,防止遍歷到string
tds = tr('td')
#等同於tds = tr.find_all('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printList(ulist,num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^8}"
print(tplt.format("排名","學校名稱","總分",chr(12288)))
#chr(12288)使中文對齊
for i in range(num):
u = ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)
def saveToExcel(ulist):
df = pd.DataFrame(ulist,columns=['排名','學校名稱','總分'])
df.to_excel('C:/Temp/school.xlsx')
print("保存成功")
def main():
uinfo = [] #用於存放內容
url = "http://www.zuihaodaxue.com/Greater_China_Ranking2019_0.html"
html = getHtml(url)
fillList(uinfo,html)
printList(uinfo,20)
saveToExcel(uinfo)
main()
本文部分內容參考於北京理工大學嵩天老師相關課程