最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲beautiful?soup的使用方式

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

前言

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

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

一,Beautiful Soup簡介

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

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

二,Beautiful Soup的解析器

2.1 各種解析器一覽

2.2 引入解析器的語法

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

三,Beautiful Soup解析得到的四種對象

3.1 四種對象 一覽

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

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

3.2 bs對象的tag屬性

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

詳細如下圖:

舉例如下:

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

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

用于打印整個格式化之后的html文檔,會自動補全缺少的標簽。

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

3.4 bs對象tag對象的屬性獲取

屬性可以通過tag['key']來讀取,也可以用一個全新的變量來綁定tag的attrs屬性進行訪問?;蛘呤褂胻ag.get(attr_name)來獲取屬性的value。另外attrs是一個字典,支持字典的增刪改查等操作,從而操作tag的屬性。

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

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對象

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

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

他指代某個標簽里面的文字內(nèi)容,而不包括里面嵌套的標簽。由于其類似字符串,所以無法修改,但是可以使用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對象及beautiful soup對象

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

說其是一種特殊的 NavigableString對象,是因為:tag.string可以為一個 NavigableString對象,也有可能為一個comment對象。但是一般使用tag.string來訪問元素內(nèi)容,而不是元素里面的注釋。

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

四,標簽的定位

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

4.1 find()&find_all()方法

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

需要注意find_all()的參數(shù),可以是一個tag_name,一個正則對象,一個列表(如,['div','a']),一個keyword(如,id="mmd"),一個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ù)是一個css選擇器。 與前端css中的各種選擇器一模一樣,這個比find_all()更加常用,畢竟與前端比較類似,容錯率高。

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

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

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

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

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

相關文章

  • python 顯示數(shù)組全部元素的方法

    python 顯示數(shù)組全部元素的方法

    下面小編就為大家分享一篇python 顯示數(shù)組全部元素的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python中字符串的處理技巧分享

    Python中字符串的處理技巧分享

    這篇文章給大家分享了Python中字符串的處理技巧,包括拆分含有多種分隔符的字符串、判斷字符串a(chǎn)是否以字符串b開頭或結(jié)尾、調(diào)整字符串中文本的格式已經(jīng)將多個小字符串拼接成一個大的字符串等,感興趣的朋友們可以通過閱讀下文來學習。
    2016-09-09
  • Python使用turtle庫繪制科赫雪花詳細代碼

    Python使用turtle庫繪制科赫雪花詳細代碼

    科赫曲線是一種分形,其形態(tài)非常像雪花,因此又被稱作科赫雪花、雪花曲線,這篇文章主要給大家介紹了關于Python使用turtle庫繪制科赫雪花的相關資料,需要的朋友可以參考下
    2024-05-05
  • Python SqlAlchemy動態(tài)添加數(shù)據(jù)表字段實例解析

    Python SqlAlchemy動態(tài)添加數(shù)據(jù)表字段實例解析

    這篇文章主要介紹了Python SqlAlchemy動態(tài)添加數(shù)據(jù)表字段實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • python簡單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程

    python簡單幾步獲取各種DOS命令顯示的內(nèi)容詳解流程

    你會用python獲取各種DOS命令顯示的內(nèi)容核心嗎?說的可不是返回值,是用system()函數(shù)調(diào)用windows操作系統(tǒng)的DOS命令來做點事情,需要的朋友可以參考下
    2021-10-10
  • es+flask搜索小項目實現(xiàn)分頁+高亮的示例代碼

    es+flask搜索小項目實現(xiàn)分頁+高亮的示例代碼

    本文主要介紹了es+flask搜索小項目實現(xiàn)分頁+高亮的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python中property屬性的介紹及其應用詳解

    python中property屬性的介紹及其應用詳解

    這篇文章主要介紹了python中property屬性的介紹及其應用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • python清除字符串里非數(shù)字字符的方法

    python清除字符串里非數(shù)字字符的方法

    這篇文章主要介紹了python清除字符串里非數(shù)字字符的方法,涉及Python使用re模塊正則替換操作字符串的技巧,需要的朋友可以參考下
    2015-07-07
  • Python爬蟲如何應對Cloudflare郵箱加密

    Python爬蟲如何應對Cloudflare郵箱加密

    這篇文章主要介紹了Python爬蟲如何應對Cloudflare郵箱加密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 解決python web項目意外關閉,但占用端口的問題

    解決python web項目意外關閉,但占用端口的問題

    今天小編就為大家分享一篇解決python web項目意外關閉,但占用端口的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論

普兰店市| 五大连池市| 元氏县| 洛川县| 崇左市| 静海县| 新化县| 罗山县| 纳雍县| 北流市| 石渠县| 景德镇市| 新安县| 台南市| 闻喜县| 林周县| 崇仁县| 大化| 纳雍县| 江山市| 安徽省| 天镇县| 峨边| 吉首市| 察哈| 正宁县| 离岛区| 石台县| 前郭尔| 邹城市| 玉树县| 喀喇| 樟树市| 龙山县| 永德县| 北辰区| 阿拉善盟| 隆昌县| 梧州市| 康定县| 南华县|