在我們學會了BeautifulSoup庫的用法后,我們就可以使用這個庫對HTML進行解析,從網頁中提取我們需要的內容。
在BeautifulSoup 文檔里,find()、find_all()兩者的定義如下:
find(tag, attributes, recursive, text, keywords)
find(標簽,屬性,遞歸,文本,關鍵詞)
find_all(tag, attributes, recursive, text, limit, keywords)
find_all(標簽、屬性、遞歸、文本、限制、關鍵詞)
find()與find_all()的區別,find()只會取符合要求的第一個元素,find_all()會根據范圍限制參數limit限定的范圍取元素(默認不設置代表取所有符合要求的元素,find 等價於 find_all的 limit =1 時的情形),接下來將對每個參數一一介紹。
另外,find_all()會將所有滿足條件的值取出,組成一個list
下面我們就一一介紹函數中各個參數的作用:
一、標簽tag
標簽參數 tag 可以傳一個標簽的名稱或多個標簽名稱組成的set做標簽參數。例如,下面的代碼將返回一個包含 HTML 文檔中所有鏈接標簽的列表: find_all("a")
下面以“百度一下”網頁舉例,如下圖,現在要將百度頁面上的所有的鏈接取出,觀察網頁源代碼可以發現,標題對應的tag 是a,則soup.find_all('a')
代碼如下:
from bs4 import BeautifulSoup
import requests
url = 'https://www.baidu.com/'
urlhtml = requests.get(url)
urlhtml.encoding = 'utf-8'
soup = BeautifulSoup(urlhtml.text, 'lxml')
n = soup.find_all('a')
print(n)
結果如下,我們就找出了全部的<a>標簽。
上面例子只是一個標簽的情況,如果多個標簽寫法相同,只是注意要將所有的標簽寫在一個set里面
二、屬性attributes
屬性參數 attributes 是用字典封裝一個標簽的若干屬性和對應的屬性值。如,下面這個函數會返回 HTML 文檔里“mnav”的a標簽。find_all("a", {"class":{"mnav"}})
如下圖,現在要獲取網頁中的“新聞”等信息,通過觀察可知,它們的屬性為"mnav",標簽為a。
則我們可以編寫代碼:
from bs4 import BeautifulSoup import requests url = 'https://www.baidu.com/' urlhtml = requests.get(url) urlhtml.encoding = 'utf-8' soup = BeautifulSoup(urlhtml.text, 'lxml')
n = soup.find_all('a', {'class': 'mnav'}) print(n)
運行結果如下,可以看出輸出的鏈接的屬性全部為“mnav”。
三、遞歸recursive
遞歸參數 recursive 是一個布爾變量。你想抓取 HTML 文檔標簽結構里多少層的信息?如recursive 設置為 True, find_all()就會根據你的要求去查找標簽參數的所有子標簽,以及標簽的子標簽。如果 recursive 設置為 False, find_all()就只查找文檔的一級標簽。 find_all默認是支持遞歸查找的(recursive 默認值是 True),這里是很少使用的,所以我在這兒就不在舉例了。
四、文本text
文本參數 text 有點不同,它是用標簽的文本內容去匹配,而不是用標簽的屬性。
我們再以“百度一下”的網頁舉例吧,在這個網頁中,我們查找一下“新聞”在該網頁中出現了多少個(其實只出現了一個)
from bs4 import BeautifulSoup import requests url = 'https://www.baidu.com/' urlhtml = requests.get(url) urlhtml.encoding = 'utf-8' soup = BeautifulSoup(urlhtml.text, 'lxml') n = soup.find_all(text='新聞') print(n)
結果如下:
需要特別注意一點,這里查找是用的是完全匹配原則,意思是如果這里你用了find_all(text=“新”),得到的結果會是0個
五、關鍵詞keywords
關鍵詞參數 keyword,自己選擇那些具有指定屬性的標簽
上面網頁的內容,現在要取id='wrapper'的內容,則
from bs4 import BeautifulSoup import requests url = 'https://www.baidu.com/' urlhtml = requests.get(url) urlhtml.encoding = 'utf-8' soup = BeautifulSoup(urlhtml.text, 'lxml') n = soup.find_all(id='wrapper') print(n)
結果如下,也就是選中的<div>中的內容
注意:如果是class、id等參數,用keywords 或者attributes用法一樣,如果是一些其他參數,則用keywords