python爬蟲常用庫之BeautifulSoup詳解

2021-03-02 日常學python

經過了前面幾篇文章的學習,估計你已經會爬不少中小型網站了。但是有人說,前面的正則很難唉,學不好。正則的確很難,有人說過:如果一個問題用正則解決,那麼就變成了兩個問題。所以說學不會是很正常的,不怕,除了正則,我們還可以用另外一個強大的庫來解析html。所以,今天的主題就是來學習這個強大的庫--BeautifulSoup,不過正則還是需要多多練習下的。

因為是第三方庫所以我們需要下載,在命令行敲下以下代碼進行下載

pip install beautifulsoup4

安裝第三方解析庫

如果不知道有什麼用請往下看

1.相關解析庫的介紹

這裡官方推薦解析庫為lxml,因為它的效率高。下面都是用lxml解析庫來進行解析的。

2.詳細語法介紹

本文是進行解析豆瓣圖書首頁https://book.douban.com/

1)創建bs對象

from bs4 import BeautifulSoup
import requests
response = requests.get('https://book.douban.com/').text


soup = BeautifulSoup(response, 'lxml')  # 使用到了lxml解析庫

2)獲取相關標籤

標籤:

<a data-moreurl-dict='{"from":"top-nav-click-main","uid":"0"}' href="https://www.douban.com" target="_blank">豆瓣</a>

上面的a就是一個標籤名字,最簡單的就是<a></a>這樣,可以簡單理解為<>裡面的第一個單詞就是標籤名


print(soup.li)  

<li class="">
<a data-moreurl-dict='{"from":"top-nav-click-main","uid":"0"}' href="https://www.douban.com" target="_blank">豆瓣</a>
</li>

3)獲取標籤的名字和內容

標籤的名字和內容:

如上面所說,a就是標籤名字,而兩個標籤之中所夾雜的內容就是我們所說的內容,如上,豆瓣就是該標籤的內容


print(soup.li.name)

print(soup.li.string)  

li
None

由於這個li標籤裡面還有個子標籤,所以它的文本內容為None

下面這個就可以獲取它的文本內容


print(soup.li.a)
print(soup.li.a.string)  

<a data-moreurl-dict='{"from":"top-nav-click-main","uid":"0"}' href="https://www.douban.com" target="_blank">豆瓣</a>
豆瓣

4)獲取標籤屬性,有兩種方法

標籤屬性:

<a href="https://www.douban.com" target="_blank">豆瓣</a>

可以簡單理解為屬性就是在標籤名字旁邊而且在前一個<>符號裡面的,還有是有等號來進行體現的。所以上面的href就是標籤屬性名字,等號右邊的就是屬性的值,上面的值是個網址


print(soup.li.a['href'])  
print(soup.li.a.attrs['href'])  

https://www.douban.com
https://www.douban.com

5)獲取標籤內的子標籤

子標籤:

比如我們現在獲取的li標籤,所以a標籤就是li標籤子標籤


print(soup.li.a)

<a data-moreurl-dict='{"from":"top-nav-click-main","uid":"0"}' href="https://www.douban.com" target="_blank">豆瓣</a>

6)獲取所有子節點

子節點:這個和子標籤是差不多的,只不過這裡是獲取一個標籤下的所有子標籤,上面的只是獲取最接近該標籤的子標籤


print(soup.div.contents)  
for n, tag in enumerate(soup.div.contents):
   print(n, tag)

['\n', <div class="bd">
<div class="top-nav-info">
<a class="nav-login" href="https://www.douban.com/accounts/login?source=book" rel="nofollow">登錄</a>
...
0

1 <divhljs-string">">
<divhljs-string">">
...

這個是獲取div下的所有子節點,.content就是獲取子節點的屬性

7)第二種方法獲取所有子節點


print(soup.div.children)  
for n, tag in enumerate(soup.div.children):
   print(n, tag)

這個是用.children獲取所有的子節點,這個方法返回的是一個迭代器

8)獲取標籤的子孫節點,就是所有後代

子孫節點:

<ul>
<li>
<a>豆瓣</a>
</li>
</ul>

從上面知道,li標籤ul標籤子標籤a標籤li標籤子標籤,若此時我們獲取的是ul標籤,所以li標籤和a標籤都是ul標籤的子孫節點


print(soup.div.descendants)  
for n, tag in enumerate(soup.div.descendants):
   print(n, tag)
# 結果
...
<generator object descendants at 0x00000212C1A1E308>
0

1 <div class="bd">
<div class="top-nav-info">
<a class="nav-login" href="https://www.douban.com/accounts/login?source=book" rel="nofollow">登錄</a>
...

這裡用到了.descendants屬性,獲取的是div標籤的子孫節點,而且返回結果是一個迭代器

9)獲取父節點和所有祖先節點

既然有了子節點和子孫節點,反過來也是有父節點和祖先節點的,所以都很容易理解的


print(soup.li.parent)  

print(soup.li.parents)  
for n, tag in enumerate(soup.li.parents):
   print(n, tag)

.parent屬性是獲取父節點,返回來的是整個父節點,裡面包含該子節點。.parents就是獲取所有的祖先節點,返回的是一個生成器

10)獲取兄弟節點

兄弟節點:

<ul>
<li>
<a>豆瓣1</a>
</li>
<li>
<a>豆瓣2</a>
</li>
<li>
<a>豆瓣3</a>
</li>
</ul>

比如上面的html代碼,裡面的li標籤都是ul標籤的子節點,而li標籤都是處於同級的,所以上面的li標籤都是各自的兄弟。這就是兄弟節點。


print(soup.li.next_siblings)  
for x in soup.li.next_siblings:
   print(x)

<generator object next_siblings at 0x000002A04501F308>
<li class="on">
<a data-moreurl-dict='{"from":"top-nav-click-book","uid":"0"}' href="https://book.douban.com">讀書</a>
</li>
...

.next_siblings屬性是獲取該標籤的所有在他後面的兄弟節點,不包括他本身。同時返回結果也是一個迭代器

同理,既然有獲取他的下一個所有兄弟標籤,也有獲取他前面的所有兄弟標籤

soup.li.previous_siblings

如果只是獲取一個即可,可以選擇把上面的屬性後面的s字母去掉即可,如下

soup.li.previous_sibling  
soup.li.next_sibling  

3.bs庫的更高級的用法

在前面我們可以獲取標籤的名字、屬性、內容和所有的祖孫標籤。但是當我們需要獲取任意一個指定屬性的標籤還是有點困難的,所以,此時有了下面這個方法:

soup.find_all( name , attrs , recursive , text , **kwargs )

1)先使用name參數來進行搜索


print(soup.find_all('li'))  

[<li class="">
<a data-moreurl-dict='{"from":"top-nav-click-main","uid":"0"}' href="https://www.douban.com" target="_blank">豆瓣</a>
</li>, <li>
...

這裡獲取了所有標籤名字為li的標籤

2)使用name和attrs參數


print(soup.find_all('div', {'class': 'more-meta'}))  

[<div class="more-meta">
<h4 class="title">
                 刺
               </h4>
...

這裡搜索了具有屬性為class='more-meta'的div標籤

3)根據關鍵字參數來搜索


print(soup.find_all(class_='more-meta'))  

和上面的結果一樣
...

這裡注意,我們找的是class屬性為more-meta的標籤,用了關鍵字參數,但是python裡面有class關鍵字,所以為了不使語法出錯,所以需要在class加個下劃線

其他參數的就不再介紹了,可以自行去官網查看

4)find()方法

此方法與find_all()方法一樣,只不過這個方法只是查找一個標籤而已,後者是查找所有符合條件的標籤。

還有很多類似的方法,用法都差不多,就不再一一演示了,需要的可以去官網查看

5)select()方法

這個方法是使用css選擇器來進行篩選標籤的。

css選擇器:就是根據標籤的名字,id和class屬性來選擇標籤。

通過標籤名:直接寫該標籤名,如 li a  ,這個就是找li標籤下的a標籤

通過class屬性:用. 符號加class屬性值,如 .title .time 這個就是找class值為title下的class值為time的標籤

通過id屬性:用# 加id屬性值來進行查找,如 #img #width 這個就是找id值為img下的id值為width的標籤

上面三者可以混合使用,如 ul .title #width

如果還不太會的話,可以直接在瀏覽器上按下f12來查看

位置在箭頭所指的位置就是選擇器的表達

代碼如下


print(soup.select('ul li div'))  
print(soup.select('.info .title'))  
print(soup.select('#footer #icp'))  

print(soup.select('ul li .cover a img'))

這裡的獲取屬性和文本內容


for attr in soup.select('ul li .cover a img'):
   
   
   print(attr['alt'])


for tag in soup.select('li'):
   print(tag.get_text())  

.get_tex()方法和前面的.string屬性有點不一樣哈,這裡的他會獲取該標籤的所有文本內容,不管有沒有子標籤

寫在最後

以上的這些都是個人在學習過程中做的一點筆記。還有點不足,如果有錯誤的話歡迎大佬指出哈。如果想要查看更多相關用法可以去官方文檔查看:http://beautifulsoup.readthedocs.io/zh_CN/latest/

學習參考資料:https://edu.hellobi.com/course/157

如果這篇文章對你有用,點個讚,轉個發如何?

還有,祝大家今天愚人節快樂


日常學python

代碼不止bug,還有美和樂趣

相關焦點

  • 小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)
    爬蟲(3):前置準備(二)Linux基礎入門小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門小白學 Python 爬蟲(5):前置準備(四)資料庫基礎小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝小白學 Python 爬蟲(7):HTTP 基礎小白學 Python 爬蟲(8):網頁基礎
  • python爬蟲系列二: Beautiful Soup庫學習筆記
    收錄於話題 #爬蟲安裝:1.安裝beautiful soup4  即bs4          2.安裝lxmlBeautiful Soup對象beautiful soup對象:代表要解析的整個文檔樹,它支持遍歷文檔樹和搜索文檔樹中描述的大部分方法
  • 【一起學爬蟲】BeautifulSoup庫詳解
    回顧上一次介紹正則表達式的時候,分享了一個爬蟲實戰,即爬取豆瓣首頁所有的:書籍、連結、作者、出版日期等。
  • Python爬蟲從入門到精通(3): BeautifulSoup用法總結及多線程爬蟲爬取糗事百科
    本文是Python爬蟲從入門到精通系列的第3篇。我們將總結BeautifulSoup這個解析庫以及常用的find和select方法。
  • Python爬蟲快速入門,BeautifulSoup基本使用及實踐
    爬蟲,是學習Python的一個有用的分支,網際網路時代,信息浩瀚如海,如果能夠便捷的獲取有用的信息,我們便有可能領先一步,而爬蟲正是這樣的一個工具。「Python數據之道」 之前已經分享過一些關於介紹 爬蟲 的內容,大家也可以前往閱讀:Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫。
  • Python 爬蟲之 BeautifulSoup
    點擊上方藍字,快速關注我們)來源:chenjiabing666chenjiabing666.github.io/2017/04/29/python
  • 「小白學爬蟲連載(5)」——Beautiful Soup庫詳解
    歡迎大家關注公眾號【哈希大數據】Beautiful Soup是解析、遍歷、維護HTML或XML文件的Python功能庫,它能幫助我們快速獲取到文件中的數據信息。Beautiful Soup安裝與測試對於Windows平臺:首先介紹一種簡單的安裝包的方法,打開cmd,執行pip installbeautifulsoup4,這裡千萬不要忘記最後的數字4。
  • Python爬蟲常用庫之requests詳解
    作者:sergiojune      個人公眾號:日常學python作者好文:Python爬蟲常用庫之
  • Python爬蟲html解析,還在用BeautifulSoup嗎?試試PyQuery吧
    在初學python時,大家都喜歡寫些小腳本來爬些網頁,因為這能在最短的時間讓我們達到一種小小的滿足感,通常我們解析網頁時有幾種方法:正則表達式匹配 - 比較低級用beautifulsoup、pyquery等包解析用scrapy、pyspider等框架來解析其實,方法
  • python爬蟲系列(3)- 網頁數據解析(bs4、lxml、Json庫)
    python 爬蟲 常見流程.jpg本文記錄解析網頁bs4、lxml、Json一些常用方法和使用樣板簡介通過requests庫向網站請求網頁,獲得網頁原始碼之後,下一步的工作就需要對網頁代碼進行解析,方便後面的提取工作。永恆君目前常使用的有lxml、bs4、json等庫,本文就記錄一些常用方法,以及一些使用樣板。
  • python程序媛BeautifulSoup快速入門
    爬蟲最常用就是要在response回的html文件中獲取我們想要的資源,而常用方法除了正則就是BeautifulSoup庫了。其實,媛媛本人呢,是習慣使用正則的,不過經常聽到很多同學表示正則太複雜,想要使用BeautifulSoup庫,今天呢,就滿足大家,帶著大家超級簡單案例,快速入門。
  • 5分鐘快速學習掌握python爬蟲Beautifulsoup解析網頁
    python爬蟲用Beatifulsoup庫解析網頁提取所需元素新手看懂個人觀點:之前我們有講過爬蟲和網頁的一些聯繫,網頁的一些組成部分,爬蟲就是對網頁裡面的數據進行提取然後對其進行數據處理,篩選出所需部分,供需要者使用。
  • 爬蟲入門系列(四):HTML文本解析庫BeautifulSoup
    BeautifulSoup 是一個用於解析 HTML 文檔的 Python 庫,通過 BeautifulSoup,你只需要用很少的代碼就可以提取出 HTML 中任何感興趣的內容,此外,它還有一定的 HTML 容錯能力,對於一個格式不完整的HTML 文檔,它也可以正確處理。
  • 美女老師帶你做爬蟲:BeautifuSoup庫詳解及實戰!
    工具:python2.7版本+pycharm模塊:urllib、urllib2、BeautifuSoup4模塊(解析器lxml、html)課題:BeautifuSoup原理詳解,項目實戰應用!目標:1、了解Beautifulsoup庫 2、學會Beautifulsoup庫及其參數 3、通過一個項目使用beautifulsoup4模塊爬取內容HTML文件其實就是由一組尖括號構成的標籤組織起來的,每一對尖括號形式一個標籤,標籤之間存在上下關係,形成標籤樹;因此可以說
  • [Python從零到壹] 五.網絡爬蟲之BeautifulSoup基礎語法萬字詳解
    所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵。Python系列整體框架包括基礎語法10篇、網絡爬蟲30篇、可視化分析10篇、機器學習20篇、大數據分析20篇、圖像識別30篇、人工智慧40篇、Python安全20篇、其他技巧10篇。
  • [Python從零到壹] 六.網絡爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解
    所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵。Python系列整體框架包括基礎語法10篇、網絡爬蟲30篇、可視化分析10篇、機器學習20篇、大數據分析20篇、圖像識別30篇、人工智慧40篇、Python安全20篇、其他技巧10篇。
  • Python爬蟲教學(寫給入門的新手)
    前言剛學完python基礎,想學習爬蟲的新手,這裡有你想要的東西。
  • 技術分享|利用Python和BeautifulSoup進行網頁爬取(新手教程)
    而Python則是目前數據科學項目中最常用的程式語言之一。使用Python與BeautifulSoup可以很容易的進行網頁爬取,通過網站爬蟲獲取信息可以幫助企業或個人節省很多的時間和金錢。學習本文之後,我相信大部分新手都能根據自己的需求來開發出相應的網頁爬蟲。
  • Python爬蟲基礎教學(寫給入門的新手)
    前言剛學完python基礎,想學習爬蟲的新手,這裡有你想要的東西。本文著重點在於教新手如何學習爬蟲,並且會以外行人的思維進行形象地講解。最近我一兄弟想學,我就想寫個教學給他,然後想不如分享到網絡上,給熱愛學習的人們一起學習探討。
  • BeautifulSoup | 讓你一次性搞清楚BeautifulSoup!(上)
    說到BeautifulSoup大家一定都不陌生,它是python的一個庫,最主要的功能是從網頁抓取數據,但是繁瑣的規矩和看不懂網頁的結構總讓人似懂非懂