如何利用BeautifulSoup庫查找HTML上的內容

點擊上方藍字關注"程序員Bob"呀~css


必定要愛着點什麼,恰似草木對光陰的鐘情。html

——汪曾祺python


上次小編談到了對網頁信息內容的爬取,那麼在具體的編程體系中該如何實現呢?程序員



1.方法介紹web



BeautifulSoup庫給咱們提供了一個 find_all方法 ,以下:
<>.find_all(name,attrs,recursive,string,**kwargs)

find_all函數的功能是返回一個列表,存儲咱們須要查找的內容。



2.相關參數介紹
編程




第一個參數是name:對HTML中標籤名稱的檢索字符串。swift


好比咱們在http://python123.io/ws/demo.html這個簡單的網頁中找到與a和b標籤相關的內容。微信


首先,打開網頁右鍵找到檢查,而後能夠看到與a和b標籤相關的內容:app


下一步,咱們決定用上面BeautifulSoup庫提供的方法開始查找及其準備:框架

  1. 引用相關庫。
  2. 用get方法構造一個請求,獲取HTML網頁。
  3. 將網頁對應的內容儲存到demo變量中,並對HTML網頁進行解析。
  4. 隨後便使用查找語句對標籤的查找。

相關代碼以下:
import requestsfrom bs4 import BeautifulSoupr=requests.get("http://python123.io/ws/demo.html")demo=r.textsoup=BeautifulSoup(demo,"html.parser")print(demo)print(soup.find_all('a'))print(soup.find_all(['a','b']))

運行結果以下:


若是咱們要查找的網頁是一個較大的網站,所涉及的標籤內容不少,那麼該如何查找呢?


To:加個for循環,便可打印出全部的標籤信息。


相關代碼以下:

import requestsfrom bs4 import BeautifulSoupr=requests.get("http://python123.io/ws/demo.html")demo=r.textsoup=BeautifulSoup(demo,"html.parser")for tag in soup.find_all(True):    print(tag.name)

運行結果以下:



第二個參數是attrs:對標籤屬性值的檢索字符串,可標註屬性檢索。

  1. 查找p標籤包含course的屬性值。

  2. 查找id=link1的屬性值。


相關代碼以下:
import requestsfrom bs4 import BeautifulSoupr=requests.get("http://python123.io/ws/demo.html")demo=r.textsoup=BeautifulSoup(demo,"html.parser")print(soup.find_all('p','course'))#查找p標籤包含course的屬性值print(soup.find_all(id='link1'))#查找id=link1的屬性值

運行結果以下:



第三個參數:recursive:是否對子孫標籤所有檢索,默認True。

1.對a標籤是否進行子孫標籤所有檢索。

相關代碼以下:
import requestsfrom bs4 import BeautifulSoupr=requests.get("http://python123.io/ws/demo.html")demo=r.textsoup=BeautifulSoup(demo,"html.parser")print(soup.find_all('a'))print(soup.find_all('a',recursive=False))#先後對比

運行結果以下:



第四個參數是string:<>...</>中字符串區域的檢索字符串。

1.檢索字符串Basic Python。
相關代碼以下:
import requestsfrom bs4 import BeautifulSoupr=requests.get("http://python123.io/ws/demo.html")demo=r.textsoup=BeautifulSoup(demo,"html.parser")print(soup)print(soup.find_all(string="Basic Python"))#先後對比

運行結果以下:




3.與find_all相關的方法




在之後的Python爬蟲中,find_all方法會常常用到,同時,Python也爲它提供了一些 簡寫形式 ,如:
<tag>(...) 等價於 <tag>.find_all(...)soup(...)等價於 soup.find_all(...)

最後,介紹與find_all相關的擴展方法, 其函數內部參數與find_all相同:
  • <>.find():搜索且只返回一個結果,字符串類型。

  • <>.find_parents():在先輩節點中搜索,返回列表類型。

  • <>.find_parent():在先輩節點中返回一個結果,字符串類型。

  • <>.find_next_siblings():在後續平行節點中搜索,返回列表類型。

  • <>.find_next_silbling():在後續平行節點中返回一個結果,字符串類型。

  • <>.find_previous_siblings():在前序平行節點中搜索,返回列表類型。

  • <>.find_previous_sibling():在前序平行節點中返回一個結果,字符串類型。


To:其上方法區別主要在於檢索區域和檢索返回次數結果個數的不一樣。

Python爬蟲系列,未完待續...

爲你,千千萬萬遍.

往期推薦:

小Bob的2020文章系列總結~

2021-02-19

投資理財:基金雜談

2021-02-08

Python爬蟲系列:安裝Scrapy框架的那些事

2021-02-03


一鍵三連,就差你了

本文分享自微信公衆號 - 程序員Bob(gh_8a1a1530d0bf)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索