Python爬蟲(4):Beautiful Soup的常用方法
Requests
庫的用法大家肯定已經熟練掌握了,但是當我們使用Requests
獲取到網頁的 HTML 程式碼資訊後,我們要怎樣才能抓取到我們想要的資訊呢?我相信大家肯定嘗試過很多辦法,比如字串的 find 方法,還有高階點的正則表示式。雖然正則可以匹配到我們需要的資訊,但是我相信大家在匹配某個字串一次一次嘗試著正則匹配的規則時,一定很鬱悶。
那麼,我們就會想有沒有方便點的工具呢。答案是肯定的,我們還有一個強大的工具,叫BeautifulSoup
。有了它我們可以很方便地提取出HTML
或XML
標籤中的內容,這篇文章就讓我們瞭解下BeautifulSoup
的常用方法吧。
什麼是BeautifulSoup?
Python
的網頁解析可以用正則表示式去完成,那麼我們在寫的時候,要挨個的去把程式碼拿出來匹配,而且還要寫匹配的規則,整體實現起來就很複雜。BeautifulSoup
呢,它是一個方便的網頁解析庫,處理高效,支援多種解析器。大部分情況下,利用它我們不在需要編寫正則表示式就可以方便的實現網頁資訊的提取。
安裝:$ pip install beautifulsoup4
BeautifulSoup
是一個網頁解析庫,它支援很多解析器,不過最主流的有兩個。一個是Python
標準庫,一個是lxml
HTML 解析器。兩者的使用方法相似:
from bs4 import BeautifulSoup # Python的標準庫 BeautifulSoup(html, 'html.parser' ) # lxml BeautifulSoup(html, 'lxml' ) |
Python
內建標準庫的執行速度一般,但是低版本的Python
中,中文的容錯能力比較差。lxml
HTML 解析器的執行速度快,但是需要安裝 C語言的依賴庫。
lxml的安裝
由於lxml
安裝需要依賴C語言庫,所以當lxml
在Windows
上安裝時,我們會發現各種奇怪的報錯,當然臉好的使用pip install lxml
安裝也是可以成功的。不過大部分人都是會倒在這裡。
這裡推薦大家使用lxml
的.whl
檔案來安裝。首先我們需要安裝一下wheel
庫,有了這個庫我們才可以正常安裝.whl
pip install wheel
從官方網站下載與系統,Python
版本匹配的lxml檔案:地址。
另外,不知道自己系統和python
版本資訊的夥伴。需要進入系統管理員工具(CMD)或者python的 IDLE,輸入以下程式碼:
import pip print (pip.pep425tags.get_supported()) |
這時我們就可以看到打印出來的Python
版本資訊了。
下載好lxml
的檔案後,我們需要找到檔案的位置,然後進入管理員工具,使用pip
安裝:pip install whl檔案的全名
安裝完成後,可以進入Python
,import
一下,如果沒有報錯,那麼恭喜你安裝成功。
如果有的夥伴覺得麻煩,那我推薦大家安裝anaconda
下載地址(如果安裝速度慢,可以找國內映象),不知道是什麼的小夥伴可以谷歌一下,有了他,那些在windows
上pip
安裝出錯的問題將不再存在。
BeautifulSoup的基本標籤選擇方法
雖然Python
內建的標準庫解析器還不錯,但是我還是推薦大家使用lxml
,因為它夠快。那麼後面的程式碼我們都是用lxml
解析器來進行演示。
我們先匯入官方文件的例子:
html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ |
HTML 程式碼,我們能夠得到一個BeautifulSoup
的物件,並能按照標準的縮排格式的結構輸出:
from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc, 'lxml' ) |
我們可以看到上面的 HTML 程式碼並不完整,接下來我們使用prettify()
方法來進行自動補全,註釋部分就是執行的輸出:
print (soup.prettify()) # <html> # <head> # <title> # The Dormouse's story # </title> # </head> # <body> # <p class="title"> # <b> # The Dormouse's story # </b> # </p> # <p class="story"> # Once upon a time there were three little sisters; and their names were # Elsie # </a> # , # Lacie # </a> # and # Tillie # </a> # ; and they lived at the bottom of a well. # </p> # <p class="story"> # ... # </p> # </body> # </html> |
獲取標籤
print (soup.title) # <title>The Dormouse's story</title> |
通過輸出結果,我們可以看到獲取內容的屬性,實際上就是 HTML 程式碼裡的一個title
標籤。
獲取名稱
print (soup.title.name) # 'title' |
實際上就是標籤的名稱。
獲取屬性
print (soup.p.attrs[ 'class' ]) # 'title' print (soup.p[ 'class' ]) # 'title' |
獲取標籤的屬性我們可以使用attrs
方法,傳給他屬性名,就可以得到標籤的屬性。通過結果我們可以看到,直接傳給p標籤屬性名,一樣可以獲取到標籤屬性。