欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲(chóng)beautiful?soup的使用方式

 更新時(shí)間:2022年08月19日 15:42:05   作者:謙虛且進(jìn)步  
這篇文章主要介紹了python爬蟲(chóng)beautiful?soup的使用方式,Beautiful?Soup依據(jù)給定的解釋器來(lái)解析html文檔,其依據(jù)html中標(biāo)簽把html文檔在內(nèi)存中轉(zhuǎn)化為類似于二叉樹(shù)的數(shù)據(jù)結(jié)構(gòu),并通過(guò)實(shí)現(xiàn)的查詢方法來(lái)查詢二叉樹(shù)以得到我們想要的爬蟲(chóng)數(shù)據(jù)

前言

 簡(jiǎn)述bs4:使用pip install beautifulsoup4將bs4包安裝到當(dāng)前的python解釋器環(huán)境,使用from bs4 import BeautifulSoup導(dǎo)入BeautifulSoup類,進(jìn)而生成BeautifulSoup類實(shí)例并調(diào)用實(shí)例相應(yīng)的屬性和方法。

bs類似于正則查詢字符串,不過(guò)不需要我們自己寫正則表達(dá)式,bs4已經(jīng)將處理爬蟲(chóng)數(shù)據(jù)時(shí)的實(shí)際問(wèn)題進(jìn)行了統(tǒng)一歸類并提出了解決方法,即:將處理html文檔字符串時(shí)遇到的問(wèn)題進(jìn)行簡(jiǎn)化并給出api,以便于對(duì)html字符串文檔進(jìn)行信息提取和篩選(不需要自己寫正則了)。

一,Beautiful Soup簡(jiǎn)介

 Beatifil soup提供一些簡(jiǎn)單的、python式的函數(shù)用來(lái)處理導(dǎo)航、搜索、修改分析樹(shù)等功能。它是一個(gè)工具箱,通過(guò)解析文檔為用戶提供需要機(jī)取的數(shù)據(jù),因?yàn)楹?jiǎn)單,所以不需要多少代碼就可以寫出一個(gè)完整的應(yīng)用程序。
Beautiul Soup自動(dòng)將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為utf8編碼。你不需要考慮編碼方式,除非文檔有指定一個(gè)編碼方式,這時(shí),Beautiful soup就不能自動(dòng)識(shí)別編碼方了。然后,你僅僅需要說(shuō)明—下原始編碼方式就可以了。一般的編碼為:utf8,gb2312等。
Beautiful Soup已成為和bxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策胳或強(qiáng)勁的速度。

總結(jié):Beautiful Soup依據(jù)給定的解釋器來(lái)解析html文檔,其依據(jù)html中標(biāo)簽把html文檔在內(nèi)存中轉(zhuǎn)化為類似于二叉樹(shù)的數(shù)據(jù)結(jié)構(gòu),并通過(guò)實(shí)現(xiàn)的查詢方法來(lái)查詢二叉樹(shù)以得到我們想要的爬蟲(chóng)數(shù)據(jù)。也就是Beautiful Soup專門用于處理html這種有著規(guī)范格式的文檔字符串,他會(huì)自動(dòng)補(bǔ)全html標(biāo)簽以及根據(jù)標(biāo)簽層級(jí)結(jié)構(gòu)進(jìn)行文檔格式化,使其更美觀,而且支持query各種標(biāo)簽。

二,Beautiful Soup的解析器

2.1 各種解析器一覽

2.2 引入解析器的語(yǔ)法

# soup對(duì)象 = BeautifulSoup(爬取得到的文檔字符串, 解析器)
soup = BeautifulSoup(html, 'lxml')

三,Beautiful Soup解析得到的四種對(duì)象

3.1 四種對(duì)象 一覽

Beautiful Soup將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸納為4種: Tag , Navigablestring , BeautifulSoup , Comment .

具體指代如下:BeautifulSoup指代整個(gè)html文檔,即document。

3.2 bs對(duì)象的tag屬性

tag為一個(gè)統(tǒng)稱,可以具體為html的各種標(biāo)簽,如h1-h6,div,a……等。實(shí)際上tag與一個(gè)節(jié)點(diǎn)對(duì)象綁定,這個(gè)節(jié)點(diǎn)對(duì)象擁有string,name,parent,attrs等屬性,指代一個(gè)html標(biāo)簽。注:只有第一個(gè)先出現(xiàn)的tag會(huì)被捕捉到。

詳細(xì)如下圖:

舉例如下:

soup = BeautifulSoup(html, 'lxml')
title = soup.title # 獲取文檔的標(biāo)題,并與變量title綁定
 
# tag對(duì)象常見(jiàn)的屬性如下:
title.name # 返回當(dāng)前tag的標(biāo)簽名稱,該屬性可讀寫
title.string # 獲取當(dāng)前tag的navigatiblestring對(duì)象
title.parent # 獲取當(dāng)前tag的父節(jié)點(diǎn)
title.attrs # 獲取當(dāng)前tag的屬性字典
 
 
# tag對(duì)象常見(jiàn)的方法如下:
title.get('class') # 括號(hào)里面寫屬性名稱,title.get('屬性名稱')
title.get('href')
title.get_text() # 獲取tag的元素內(nèi)容,與string一模一樣

3.3 bs對(duì)象的prettify屬性及prettify()方法

用于打印整個(gè)格式化之后的html文檔,會(huì)自動(dòng)補(bǔ)全缺少的標(biāo)簽。

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b id="boldest"> ','lxml')
soup.prettify()
soup.prettify
# 上面兩個(gè)等價(jià)

3.4 bs對(duì)象tag對(duì)象的屬性獲取

屬性可以通過(guò)tag['key']來(lái)讀取,也可以用一個(gè)全新的變量來(lái)綁定tag的attrs屬性進(jìn)行訪問(wèn)。或者使用tag.get(attr_name)來(lái)獲取屬性的value。另外attrs是一個(gè)字典,支持字典的增刪改查等操作,從而操作tag的屬性。

多值屬性指的是某些標(biāo)簽屬性如class,charset……等具有多個(gè)屬性值,如:<class="mmd mmd2 mmd3">,對(duì)于這種標(biāo)簽,bs將他們的屬性值放在一個(gè)list中。而如id等屬性只有一個(gè)值,他們的屬性值為str類型。多值屬性列表會(huì)自動(dòng)轉(zhuǎn)換為html里面的多值屬性語(yǔ)法格式。

css_soup = BeautifulSoup('<p class="body"></p>')
css_soup.p['class']
# ["body"]
 
id_soup = BeautifulSoup('<p id="my id"></p>')
id_soup.p['id']
# 'my id'

3.5  NavigableString對(duì)象

一般指tag.string,他是一個(gè)偽字符串對(duì)象,使用str()將其轉(zhuǎn)換為python的字符串即可。轉(zhuǎn)換之后本質(zhì)上等同于python的字符串類型。所有字符串的屬性及對(duì)字符串的方法都對(duì)其適用。

也可以不使用str()轉(zhuǎn)換,直接使用tag.text就是一個(gè)字符串。

他指代某個(gè)標(biāo)簽里面的文字內(nèi)容,而不包括里面嵌套的標(biāo)簽。由于其類似字符串,所以無(wú)法修改,但是可以使用replace_with() 方法將其修改為其他字符串。

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml')
tag = soup.b
print(tag.string)
print(type(tag.string))
# Extremely bold
# <class 'bs4.element.NavigableString'>
 
#---------------------------------------------------#
unicode_string = str(tag.string)
print(unicode_string)
print(type(unicode_string))
# Extremely bold
# <class 'str'>
 
#---------------------------------------------------#
tag.string.replace_with("No longer bold")
print(tag)
# No longer bold

3.6 comment對(duì)象及beautiful soup對(duì)象

了解即可。beautiful soup對(duì)象指代document文檔對(duì)象,本質(zhì)上也是一個(gè)tag;comment指代html文檔中的注釋內(nèi)容,是一種特殊的 NavigableString對(duì)象,實(shí)際中應(yīng)注意注釋混在元素內(nèi)容之中,造成數(shù)據(jù)污染。

說(shuō)其是一種特殊的 NavigableString對(duì)象,是因?yàn)椋簍ag.string可以為一個(gè) NavigableString對(duì)象,也有可能為一個(gè)comment對(duì)象。但是一般使用tag.string來(lái)訪問(wèn)元素內(nèi)容,而不是元素里面的注釋。

使用tag.prettify屬性來(lái)打印出某個(gè)tag里面的所有內(nèi)容,來(lái)判斷使元素內(nèi)容還是注釋。

四,標(biāo)簽的定位

使用bs最重要的部分就是標(biāo)簽定位,定位之后才能獲取得到我們想要的數(shù)據(jù)。各種定位方法都是基于對(duì)html解析樹(shù)的操作,類似于二叉樹(shù)從一個(gè)節(jié)點(diǎn)向四周尋找節(jié)點(diǎn)。所有我們需要做的就是:先定位到一個(gè)容易定位的二叉樹(shù)節(jié)點(diǎn),再?gòu)倪@個(gè)節(jié)點(diǎn)定位到我們需要的節(jié)點(diǎn)?;蛘呤褂胏ss選擇器精準(zhǔn)定位。

4.1 find()&find_all()方法

官方名字為過(guò)濾器,實(shí)際上就是通過(guò)正則匹配到我們想要的字符串。下面只介紹find_all(),find只能找一個(gè),一般不使用。

需要注意find_all()的參數(shù),可以是一個(gè)tag_name,一個(gè)正則對(duì)象,一個(gè)列表(如,['div','a']),一個(gè)keyword(如,id="mmd"),一個(gè)True……

 具體用法如下圖:

tag
soup.find_all('b')
# [<b>The Dormouse's story</b>]
 
正則
import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)
# body
# b
 
列表
soup.find_all(["a", "b"])
# [<b>The Dormouse's story</b>,
#  <a class="sister"  rel="external nofollow"  id="link1">Elsie</a>,
#  <a class="sister"  rel="external nofollow"  id="link2">Lacie</a>,
#  <a class="sister"  rel="external nofollow"  id="link3">Tillie</a>]
 
True
for tag in soup.find_all(True):
    print(tag.name)
# html
# head
# title
# body
 
方法
def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
soup.find_all(has_class_but_no_id)
# [<p class="title"><b>The Dormouse's story</b></p>,
#  <p class="story">Once upon a time there were...</p>,
#  <p class="story">...</p>]

常用寫法:

4.2 select()方法

參數(shù)是一個(gè)css選擇器。 與前端css中的各種選擇器一模一樣,這個(gè)比f(wàn)ind_all()更加常用,畢竟與前端比較類似,容錯(cuò)率高。

soup.select("title")
# [<title>The Dormouse's story</title>]
 
soup.select("p:nth-of-type(3)")
# [<p class="story">...</p>]

4.4 節(jié)點(diǎn)之間的各種關(guān)系定位函數(shù)

參看官方文檔,bs4官方文檔。

上面的selec和find_all()基本上能夠定位到任何位置了,不需要找爸爸找兒子這種形式去定位了。

到此這篇關(guān)于python爬蟲(chóng)beautiful soup的使用方式的文章就介紹到這了,更多相關(guān)python beautiful soup 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python基礎(chǔ)之畫(huà)圖神器matplotlib

    Python基礎(chǔ)之畫(huà)圖神器matplotlib

    這篇文章主要介紹了python基礎(chǔ)之畫(huà)圖神器matplotlib,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04
  • 深入解析Python中的descriptor描述器的作用及用法

    深入解析Python中的descriptor描述器的作用及用法

    在Python中描述器也被稱為描述符,描述器能夠?qū)崿F(xiàn)對(duì)對(duì)象屬性的訪問(wèn)控制,下面我們就來(lái)深入解析Python中的descriptor描述器的作用及用法
    2016-06-06
  • Python3的介紹、安裝和命令行的認(rèn)識(shí)(推薦)

    Python3的介紹、安裝和命令行的認(rèn)識(shí)(推薦)

    Python是著名的“龜叔”Guido van Rossum在1989年圣誕節(jié)期間,為了打發(fā)無(wú)聊的圣誕節(jié)而編寫的一個(gè)編程語(yǔ)言。這篇文章主要介紹了Python3的介紹、安裝和命令行的認(rèn)識(shí),需要的朋友可以參考下
    2018-10-10
  • Python獲取操作系統(tǒng)的三種方法

    Python獲取操作系統(tǒng)的三種方法

    在Python中,?如何獲取操作系統(tǒng)的類型、名稱、版本等信息,本文就來(lái)介紹三種獲取方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Django使用Mysql數(shù)據(jù)庫(kù)已經(jīng)存在的數(shù)據(jù)表方法

    Django使用Mysql數(shù)據(jù)庫(kù)已經(jīng)存在的數(shù)據(jù)表方法

    今天小編就為大家分享一篇Django使用Mysql數(shù)據(jù)庫(kù)已經(jīng)存在的數(shù)據(jù)表方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python抽樣方法解讀及實(shí)現(xiàn)過(guò)程

    python抽樣方法解讀及實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了python抽樣方法解讀及實(shí)現(xiàn)過(guò)程講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • python 爬蟲(chóng) 實(shí)現(xiàn)增量去重和定時(shí)爬取實(shí)例

    python 爬蟲(chóng) 實(shí)現(xiàn)增量去重和定時(shí)爬取實(shí)例

    今天小編就為大家分享一篇python 爬蟲(chóng) 實(shí)現(xiàn)增量去重和定時(shí)爬取實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • pandas 轉(zhuǎn)換成行列表進(jìn)行讀取與Nan處理的方法

    pandas 轉(zhuǎn)換成行列表進(jìn)行讀取與Nan處理的方法

    今天小編就為大家分享一篇pandas 轉(zhuǎn)換成行列表進(jìn)行讀取與Nan處理的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • pycharm 添加解釋器的方法步驟

    pycharm 添加解釋器的方法步驟

    這篇文章主要介紹了pycharm 添加解釋器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Playwright快速上手指南(入門教程)

    Playwright快速上手指南(入門教程)

    Playwright是由微軟公司2020年初發(fā)布的新一代自動(dòng)化測(cè)試工具,相較于目前最常用的Selenium,本文就詳細(xì)的介紹一下快速上手指南,對(duì)新手有一定的幫助,感興趣的可以了解一下
    2021-12-12

最新評(píng)論