由於上次的文章被同學吐槽了,正則表達式過於麻煩,那就用BeautifulSoup庫吧,比正則表達式簡單太多了!只需要簡單的幾條語句,即可完成網頁中某個元素的提取。他是python的一個HTML或者XML的解析庫,主要的功能是解析和提取 HTML/XML 數據。
但注意,bs僅用於HTML文件,可以是請求後的網站也可以是本地HTML文件。
BeautifulSoup庫是解析,遍歷,維護標籤樹的功能庫。
安裝:pip install beautifulsoup4
由於BeatutifulSoup3已經沒有人維護了,所以需要安裝BeatutifulSoup4。
預備知識
導入庫
from bs4 import BeautifulSoup
BeautifulSoup的四大對象。
tag(標籤)
使用find()方法獲取到的結果都是tag對象。
- tag.name : 獲取標籤名稱。
- tag.attrs : 獲取標籤內所有屬性,返回內容用字典形式保存(鍵值對)。
- 也可以用層級形式進行定位,如:soup.body.div.div.p,但比較麻煩,在BeautifulSoup中實用性不是很高。
內部文字
直接調用.string即可。
BeautifulSoup
即文檔全部內容,可以分別取裏面的各個屬性。
comment
是一種特殊的內部文字,調用時需要對調用內容進行判斷。
BeautifulSoup的節點
用這個方法可以使用目標節點的附近節點來進行查找目標節點。
子節點與子孫節點
- contents:將子標籤存入列表。
- children:將子標籤存入一個迭代器,不是列表。僅包含tag的直接子節點。
父節點與祖先節點
- parent:返回父節點的tag。
- parents:返回祖先節點。
兄弟節點
兄弟節點是存在同一層級下的,如果不存在就返回none。
next_sibling:下一個
- previous_sibling:上一個
前後節點
- next_element:下一個
- previous_element:上一個
文檔搜索
將BeautifulSoup的基本概念都瞭解了之後就要使用了,最常用的就是find()和find_all()方法。
屬性定位:soup.find_all(‘a’,id=‘name’)
多屬性定位:soup.find_all(‘a’,class=“tod”,id=“name”)
前面提到,find()方法獲取到的結果都是tag對象,這和HTML文檔中的tag相同,可以直接用tag.name和tag.attrs訪問對象的屬性和名字。
find方法
find()方法返回的是單個元素,也就是第一個匹配的元素,而前者返回的是所有匹配的元素組成的列表。
代碼格式爲:
find(self,name , attrs , recursive , text , **kwargs)
直接返回結果,不返回列表。
find all()方法
用於查找所有元素,
相較於正則表達式快很多。只需要給它傳入一些屬性或文本,就可以得到符合條件的元素,功能很強大。
代碼格式爲:
find_all(name , attrs , recursive , text , **kwargs)
返回結果爲列表。
find和find_all的區別
BeautifulSoup中find()方法和find_all()方法的使用方法是一樣的,區別在於;
- find返回第一個結果,格式爲字符串。find_all()返回的是包含所有結果的列表。
- find找不到目標時返回none,find_all()找不到目標時返回空列表。
實戰演示-小豬短租
學會了BeautifulSoup後就用BeautifulSoup4庫嘗試爬取小豬短租網站上的信息,代碼如下:
import requests
import re
from bs4 import BeautifulSoup
url = "http://xa.xiaozhu.com/search-duanzufang-p1-0/" #小豬短租
headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"}
data = requests.get(url,headers) #請求
re = data.text
soup = BeautifulSoup(re,'lxml') #用lxml解析器進行解析
這樣就已經獲取到網頁的信息了,接下來就對網頁上的信息進行提取,先提取網頁上每一個信息的url,使用find_all方法。
url = []
for i in range(len(soup.find_all('div',attrs = {'class':'result_btm_con lodgeunitname'}))):
url.append(soup.find_all('div',attrs = {'class':'result_btm_con lodgeunitname'})[i].attrs['detailurl'])
url
這樣就可以提取到網頁上的信息。
CSS選擇器
Beautiful Soup還提供了另外一種選擇器,那就是CSS選擇器。使用CSS選擇器時,只需要調用select()方法,傳入相應的字符串參數,就可以通過CSS選擇器來找到相應的tag。
形式爲:
[code]選擇器{樣式}[/code]
在BeautifulSoup中CSS選擇器的使用方法主要爲下面三種:
- 通過id查找:
soup.selsct("name")
- 通過class查找:
soup.selsct(".efg")
- 通過屬性查找:
soup.selsct('a[class="efg"]')
和find_all的實現功能一樣,但更爲方便些。
BeautifulSoup在爬蟲中主要擔任數據清洗的任務,掌握BeautifulSoup能解決大部分網站數據清洗問題。