最近在看爬蟲相關的東西,一方面是興趣,另外一方面也是借學習爬蟲練習python的使用,推薦一個很好的入門教程:中國大學MOOC的《python網絡爬蟲與信息提取》,是由北京理工的副教授嵩天老師講的,感受講的很清晰,課件也很詳細。html
學習爬蟲,怎麼也繞不開requests庫和BeautifulSoup庫,先說下BeautifulSoup庫:python
BeautifulSoup庫通俗來講是【解析、遍歷、維護「標籤樹」(例如html、xml等格式的數據對象)的功能庫 】
一個簡單的使用BeautifulSoup庫的demo:服務器
# coding:utf-8 from bs4 import BeautifulSoup import requests url = 'http://python123.io/ws/demo.html' r = requests.get(url) demo = r.text # 服務器返回響應 soup = BeautifulSoup(demo, "html.parser") """ demo 表示被解析的html格式的內容 html.parser表示解析用的解析器 """ print(soup) # 輸出響應的html對象 print(soup.prettify()) # 使用prettify()格式化顯示輸出
獲得一個BeautifulSoup對象後,通常經過BeautifulSoup類的基本元素來提取html中的內容
網絡
2.提取html中的信息學習
demo中的html內容以下:url
(1)spa
print(soup.title) # 獲取html的title標籤的信息 print(soup.a) # 獲取html的a標籤的信息(soup.a默認獲取第一個a標籤,想獲取所有就用for循環去遍歷) print(soup.a.name) # 獲取a標籤的名字 print(soup.a.parent.name) # a標籤的父標籤(上一級標籤)的名字 print(soup.a.parent.parent.name) # a標籤的父標籤的父標籤的名字
(2)code
print('a標籤類型是:', type(soup.a)) # 查看a標籤的類型 print('第一個a標籤的屬性是:', soup.a.attrs) # 獲取a標籤的全部屬性(注意到格式是字典) print('a標籤屬性的類型是:', type(soup.a.attrs)) # 查看a標籤屬性的類型 print('a標籤的class屬性是:', soup.a.attrs['class']) # 由於是字典,經過字典的方式獲取a標籤的class屬性 print('a標籤的href屬性是:', soup.a.attrs['href']) # 一樣,經過字典的方式獲取a標籤的href屬性
(3)xml
print('第一個a標籤的內容是:', soup.a.string) # a標籤的非屬性字符串信息,表示尖括號之間的那部分字符串 print('a標籤的非屬性字符串的類型是:', type(soup.a.string)) # 查看標籤string字符串的類型 print('第一個p標籤的內容是:', soup.p.string) # p標籤的字符串信息(注意p標籤中還有個b標籤,可是打印string時並未打印b標籤,說明string類型是可跨越多個標籤層次)
介紹一下find_all()方法:htm
經常使用經過find_all()方法來查找標籤元素:<>.find_all(name, attrs, recursive, string, **kwargs) ,返回一個列表類型,存儲查找的結果
• name:對標籤名稱的檢索字符串
• attrs:對標籤屬性值的檢索字符串,可標註屬性檢索
• recursive:是否對子孫所有檢索,默認True
• string:<>…</>中字符串區域的檢索字符串
(1)
print('全部a標籤的內容:', soup.find_all('a')) # 使用find_all()方法經過標籤名稱查找a標籤,返回的是一個列表類型 print('a標籤和b標籤的內容:', soup.find_all(['a', 'b'])) # 把a標籤和b標籤做爲一個列表傳遞,能夠一次找到a標籤和b標籤
(2)
for t in soup.find_all('a'): # for循環遍歷全部a標籤,並把返回列表中的內容賦給t print('t的值是:', t) # link獲得的是標籤對象 print('t的類型是:', type(t)) print('a標籤中的href屬性是:', t.get('href')) # 獲取a標籤中的url連接
(3)
for i in soup.find_all(True): # 若是給出的標籤名稱是True,則找到全部標籤 print('標籤名稱:', i.name) # 打印標籤名稱
(4)
print('href屬性爲http..的a標籤元素是:', soup.find_all('a', href='http://www.icourse163.org/course/BIT-268001')) # 標註屬性檢索 print('class屬性爲title的標籤元素是:', soup.find_all(class_='title')) # 指定屬性,查找class屬性爲title的標籤元素,注意由於class是python的關鍵字,因此這裏須要加個下劃線'_' print('id屬性爲link1的標籤元素是:', soup.find_all(id='link1')) # 查找id屬性爲link1的標籤元素
(5)
print(soup.head) # head標籤 print(soup.head.contents) # head標籤的兒子標籤,contents返回的是列表類型 print(soup.body.contents) # body標籤的兒子標籤 """對於一個標籤的兒子節點,不只包括標籤節點,也包括字符串節點,好比返回結果中的 \n"""
(6)
print(len(soup.body.contents)) # 得到body標籤兒子節點的數量 print(soup.body.contents[1]) # 經過列表索引獲取第一個節點的內容
(7)
print(type(soup.body.children)) # children返回的是一個迭代對象,只能經過for循環來使用,不能直接經過索引來讀取其中的內容 for i in soup.body.children: # 經過for循環遍歷body標籤的兒子節點 print(i.name) # 打印節點的名字