您好,登錄后才能下訂單哦!
這篇“python爬蟲beautiful soup怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“python爬蟲beautiful soup怎么使用”文章吧。
簡述bs4:使用pip install beautifulsoup4將bs4包安裝到當前的python解釋器環境,使用from bs4 import BeautifulSoup導入BeautifulSoup類,進而生成BeautifulSoup類實例并調用實例相應的屬性和方法。
bs類似于正則查詢字符串,不過不需要我們自己寫正則表達式,bs4已經將處理爬蟲數據時的實際問題進行了統一歸類并提出了解決方法,即:將處理html文檔字符串時遇到的問題進行簡化并給出api,以便于對html字符串文檔進行信息提取和篩選(不需要自己寫正則了)。
Beatifil soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要機取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。
Beautiul Soup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf8編碼。你不需要考慮編碼方式,除非文檔有指定一個編碼方式,這時,Beautiful soup就不能自動識別編碼方了。然后,你僅僅需要說明—下原始編碼方式就可以了。一般的編碼為:utf8,gb2312等。
Beautiful Soup已成為和bxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策胳或強勁的速度。
總結:Beautiful Soup依據給定的解釋器來解析html文檔,其依據html中標簽把html文檔在內存中轉化為類似于二叉樹的數據結構,并通過實現的查詢方法來查詢二叉樹以得到我們想要的爬蟲數據。也就是Beautiful Soup專門用于處理html這種有著規范格式的文檔字符串,他會自動補全html標簽以及根據標簽層級結構進行文檔格式化,使其更美觀,而且支持query各種標簽。
# soup對象 = BeautifulSoup(爬取得到的文檔字符串, 解析器) soup = BeautifulSoup(html, 'lxml')
Beautiful Soup將復雜HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對象,所有對象可以歸納為4種: Tag , Navigablestring , BeautifulSoup , Comment .
具體指代如下:BeautifulSoup指代整個html文檔,即document。
tag為一個統稱,可以具體為html的各種標簽,如h2-h7,div,a……等。實際上tag與一個節點對象綁定,這個節點對象擁有string,name,parent,attrs等屬性,指代一個html標簽。注:只有第一個先出現的tag會被捕捉到。
詳細如下圖:
舉例如下:
soup = BeautifulSoup(html, 'lxml') title = soup.title # 獲取文檔的標題,并與變量title綁定 # tag對象常見的屬性如下: title.name # 返回當前tag的標簽名稱,該屬性可讀寫 title.string # 獲取當前tag的navigatiblestring對象 title.parent # 獲取當前tag的父節點 title.attrs # 獲取當前tag的屬性字典 # tag對象常見的方法如下: title.get('class') # 括號里面寫屬性名稱,title.get('屬性名稱') title.get('href') title.get_text() # 獲取tag的元素內容,與string一模一樣
用于打印整個格式化之后的html文檔,會自動補全缺少的標簽。
from bs4 import BeautifulSoup soup = BeautifulSoup('<b id="boldest"> ','lxml') soup.prettify() soup.prettify # 上面兩個等價
屬性可以通過tag['key']來讀取,也可以用一個全新的變量來綁定tag的attrs屬性進行訪問。或者使用tag.get(attr_name)來獲取屬性的value。另外attrs是一個字典,支持字典的增刪改查等操作,從而操作tag的屬性。
多值屬性指的是某些標簽屬性如class,charset……等具有多個屬性值,如:<class="mmd mmd2 mmd3">,對于這種標簽,bs將他們的屬性值放在一個list中。而如id等屬性只有一個值,他們的屬性值為str類型。多值屬性列表會自動轉換為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'
一般指tag.string,他是一個偽字符串對象,使用str()將其轉換為python的字符串即可。轉換之后本質上等同于python的字符串類型。所有字符串的屬性及對字符串的方法都對其適用。
也可以不使用str()轉換,直接使用tag.text就是一個字符串。
他指代某個標簽里面的文字內容,而不包括里面嵌套的標簽。由于其類似字符串,所以無法修改,但是可以使用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
了解即可。beautiful soup對象指代document文檔對象,本質上也是一個tag;comment指代html文檔中的注釋內容,是一種特殊的 NavigableString
對象,實際中應注意注釋混在元素內容之中,造成數據污染。
說其是一種特殊的 NavigableString
對象,是因為:tag.string可以為一個 NavigableString
對象,也有可能為一個comment對象。但是一般使用tag.string來訪問元素內容,而不是元素里面的注釋。
使用tag.prettify屬性來打印出某個tag里面的所有內容,來判斷使元素內容還是注釋。
使用bs最重要的部分就是標簽定位,定位之后才能獲取得到我們想要的數據。各種定位方法都是基于對html解析樹的操作,類似于二叉樹從一個節點向四周尋找節點。所有我們需要做的就是:先定位到一個容易定位的二叉樹節點,再從這個節點定位到我們需要的節點。或者使用css選擇器精準定位。
官方名字為過濾器,實際上就是通過正則匹配到我們想要的字符串。下面只介紹find_all(),find只能找一個,一般不使用。
需要注意find_all()的參數,可以是一個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" href="http://example.com/elsie" rel="external nofollow" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" rel="external nofollow" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" 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>]
常用寫法:
參數是一個css選擇器。 與前端css中的各種選擇器一模一樣,這個比find_all()更加常用,畢竟與前端比較類似,容錯率高。
soup.select("title") # [<title>The Dormouse's story</title>] soup.select("p:nth-of-type(3)") # [<p class="story">...</p>]
參看官方文檔,bs4官方文檔。
上面的selec和find_all()基本上能夠定位到任何位置了,不需要找爸爸找兒子這種形式去定位了。
以上就是關于“python爬蟲beautiful soup怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。