Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,經過解析文檔爲用戶提供須要抓取的數據,由於簡單,因此不須要多少代碼就能夠寫出一個完整的應用程序。html
Beautiful Soup自動將輸入文檔轉換爲Unicode編碼,輸出文檔轉換爲utf-8編碼。你不須要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。而後,你僅僅須要說明一下原始編碼方式就能夠了。python
Beautiful Soup已成爲和lxml、html6lib同樣出色的python解釋器,爲用戶靈活地提供不一樣的解析策略或強勁的速度。 api
經過定位 HTML 標籤來格式化和組織複雜的網絡信息,用簡單易用的 Python 對象爲咱們展示 XML 結構信息。 它包含三個對象:服務器
使用方法:網絡
1>導入bs4庫和urllib庫(用於打開html網頁):函數
from bs4 import BeautifulSoup from urllib.request import urlopen
2>建立一個BeautifulSoup對象:工具
from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html") bsObj = BeautifulSoup(html)
其中,http://www.pythonscraping.com/pages/page3.html 是一個簡單的用於測試爬蟲程序的網頁:
測試
3>.find() 與 .findAll() 函數編碼
例如:nameList = bsObj.findAll("span", {"class":"green"}) ;抽取全部屬性爲 green的span標籤內的文字,find()和findAll()是最經常使用的兩個函數,藉助它們,利用標籤的不一樣屬性輕鬆地過濾HTML頁面,查找須要的標籤組或者標籤。
url
用法:
多數狀況下可能只須要用到前兩個參數,tag和attributes,attributes指HTML標籤的屬性,遞歸參數 recursive 是一個布爾變量。你想抓取 HTML 文檔標籤結構裏多少層的信息?若是recursive 設置爲 True, findAll 就會根據你的要求去查找標籤參數的全部子標籤,以及子標籤的子標籤。若是 recursive 設置爲 False, findAll 就只查找文檔的一級標籤。 findAll默認是支持遞歸查找的( recursive 默認值是 True);通常狀況下這個參數不須要設置,除非你真正瞭解本身須要哪些信息,並且抓取速度很是重要,那時你能夠設置遞歸參數
text參數用於匹配標籤的文本內容,如:nameList = bsObj.findAll(text="the prince")
keword能夠選擇具備制定屬性的標籤。
2. 第一個爬蟲程序:
先貼代碼:
from urllib.request import urlopen from urllib.error import HTTPError from bs4 import BeautifulSoup def getTitle(url): try: html = urlopen(url) except HTTPError as e: return None try: bsObj = BeautifulSoup(html.read(),'lxml') title = bsObj.body.h1 except AttributeError as e: return None return title title = getTitle("http://www.pythonscraping.com/pages/page1.html") if title == None: print("Title could not be found") else: print(title)
輸出目標網頁內title標籤內的文本:<h1>An Interesting Title</h1>,getTitle()函數返回網頁的標題,若是獲取網頁遇到問題就返回一個 None 對象。 若是服務器不存在, html 就是一個 None 對象,html.read() 就會拋出 AttributeError 。