真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python3中BeautifulSoup的使用方法

BeautifulSoup的使用

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)芒市免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

我們學(xué)習(xí)了正則表達(dá)式的相關(guān)用法,但是一旦正則寫的有問題,可能得到的就不是我們想要的結(jié)果了,而且對于一個(gè)網(wǎng)頁來說,都有一定的特殊的結(jié)構(gòu)和層級(jí)關(guān)系,而且很多標(biāo)簽都有id或class來對作區(qū)分,所以我們借助于它們的結(jié)構(gòu)和屬性來提取不也是可以的嗎?

所以,這一節(jié)我們就介紹一個(gè)強(qiáng)大的解析工具,叫做BeautiSoup,它就是借助網(wǎng)頁的結(jié)構(gòu)和屬性等特性來解析網(wǎng)頁的工具,有了它我們不用再去寫一些復(fù)雜的正則,只需要簡單的幾條語句就可以完成網(wǎng)頁中某個(gè)元素的提取。

廢話不多說,接下來我們就來感受一下BeautifulSoup的強(qiáng)大之處吧。

BeautifulSoup簡介

簡單來說,BeautifulSoup就是Python的一個(gè)HTML或XML的解析庫,我們可以用它來方便地從網(wǎng)頁中提取數(shù)據(jù),官方的解釋如下:

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

所以說,利用它我們可以省去很多繁瑣的提取工作,提高解析效率。

安裝

使用之前,我們當(dāng)然需要首先說明一下它的安裝方式。目前BeautifulSoup的最新版本是4.x版本,之前的版本已經(jīng)停止開發(fā)了,推薦使用pip來安裝,安裝命令如下:

pip3installbeautifulsoup4

當(dāng)然也可以從pypi下載whl文件安裝,鏈接如下:

https://pypi.python.org/pypi/beautifulsoup4

好,安裝完成之后可以驗(yàn)證一下,寫一段Python程序試驗(yàn)一下。

Python3中BeautifulSoup的使用方法

運(yùn)行結(jié)果

Hello

如果沒有報(bào)錯(cuò),則證明安裝沒有問題,關(guān)于它的解析用法我們在后面會(huì)詳細(xì)介紹。

注意在這里我們雖然安裝的是beautifulsoup4這個(gè)包,但是在引入的時(shí)候是引入的bs4,這是因?yàn)檫@個(gè)包源代碼本身的庫文件夾名稱就是bs4,所以安裝完成之后,這個(gè)庫文件夾就被移入到我們本機(jī)Python3的lib庫里,所以識(shí)別到的庫文件名稱就叫做bs4,所以我們引入的時(shí)候就引入bs4這個(gè)包。因此,包本身的名稱和我們使用時(shí)導(dǎo)入的包的名稱并不一定是一致的。

解析器

BeautifulSoup在解析的時(shí)候?qū)嶋H上是依賴于解析器的,它除了支持Python標(biāo)準(zhǔn)庫中的HTML解析器,還支持一些第三方的解析器比如lxml,下面我們對BeautifulSoup支持的解析器及它們的一些優(yōu)缺點(diǎn)做一個(gè)簡單的對比。

解析器使用方法優(yōu)勢劣勢

Python標(biāo)準(zhǔn)庫BeautifulSoup(markup, "html.parser")Python的內(nèi)置標(biāo)準(zhǔn)庫、執(zhí)行速度適中 、文檔容錯(cuò)能力強(qiáng)Python 2.7.3 or 3.2.2)前的版本中文容錯(cuò)能力差

lxml HTML 解析器BeautifulSoup(markup, "lxml")速度快、文檔容錯(cuò)能力強(qiáng)需要安裝C語言庫

lxml XML 解析器BeautifulSoup(markup, "xml")速度快、唯一支持XML的解析器需要安裝C語言庫

html5libBeautifulSoup(markup, "html5lib")最好的容錯(cuò)性、以瀏覽器的方式解析文檔、生成HTML5格式的文檔速度慢、不依賴外部擴(kuò)展

所以通過以上對比可以看出,lxml這個(gè)解析器有解析HTML和XML的功能,而且速度快,容錯(cuò)能力強(qiáng),所以推薦使用這個(gè)庫來進(jìn)行解析,但是這里的劣勢是必須安裝一個(gè)C語言庫,它叫做lxml,我們在這里依然使用pip安裝即可,命令如下:

pip3installlxml

安裝完成之后,我們就可以使用lxml這個(gè)解析器來解析了,在初始化的時(shí)候我們可以把第二個(gè)參數(shù)改為lxml,如下:

運(yùn)行結(jié)果是完全一致的,后面BeautifulSoup的用法實(shí)例也統(tǒng)一用這個(gè)庫來演示。

基本使用

下面我們首先用一個(gè)實(shí)例來感受一下BeautifulSoup的基本使用:

Python3中BeautifulSoup的使用方法

運(yùn)行結(jié)果:

Python3中BeautifulSoup的使用方法

首先我們聲明了一個(gè)變量html,它是一個(gè)HTML字符串,但是注意到,它并不是一個(gè)完整的HTML字符串,和標(biāo)簽都沒有閉合,但是我們將它當(dāng)作第一個(gè)參數(shù)傳給BeautifulSoup對象,第二個(gè)參數(shù)傳入的是解析器的類型,在這里我們使用lxml,這樣就完成了BeaufulSoup對象的初始化,將它賦值給soup這個(gè)變量。

那么接下來我們就可以通過調(diào)用soup的各個(gè)方法和屬性對這串HTML代碼解析了。

我們首先調(diào)用了prettify()方法,這個(gè)方法可以把要解析的字符串以標(biāo)準(zhǔn)的縮進(jìn)格式輸出,在這里注意到輸出結(jié)果里面包含了和標(biāo)簽,也就是說對于不標(biāo)準(zhǔn)的HTML字符串BeautifulSoup可以自動(dòng)更正格式,這一步實(shí)際上不是由prettify()方法做的,這個(gè)更正實(shí)際上在初始化BeautifulSoup時(shí)就完成了。

然后我們調(diào)用了soup.title.string,這個(gè)實(shí)際上是輸出了HTML中標(biāo)簽的文本內(nèi)容。所以soup.title就可以選擇出HTML中的<title>標(biāo)簽,再調(diào)用string屬性就可以得到里面的文本了,所以我們就可以通過簡單地調(diào)用幾個(gè)屬性就可以完成文本的提取了,是不是非常方便?</p><p>標(biāo)簽選擇器</p><p>剛才我們選擇元素的時(shí)候直接通過調(diào)用標(biāo)簽的名稱就可以選擇節(jié)點(diǎn)元素了,然后再調(diào)用string屬性就可以得到標(biāo)簽內(nèi)的文本了,這種選擇方式速度非常快,如果單個(gè)標(biāo)簽結(jié)構(gòu)話層次非常清晰,可以選用這種方式來解析。</p><p>選擇元素</p><p>下面我們再用一個(gè)例子詳細(xì)說明一下它的選擇方法。</p><p><img src="/upload/otherpic70/13717038-0959e07683c51cf0.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-66d31af839ef3584.png" alt="Python3中BeautifulSoup的使用方法"></p><p>在這里我們依然選用了剛才的HTML代碼,我們首先打印輸出了title標(biāo)簽的選擇結(jié)果,輸出結(jié)果正是title標(biāo)簽加里面的文字內(nèi)容。接下來輸出了它的類型,是bs4.element.Tag類型,這是BeautifulSoup中的一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),經(jīng)過選擇器選擇之后,選擇結(jié)果都是這種Tag類型,它具有一些屬性比如string屬性,調(diào)用Tag的string屬性,就可以得到節(jié)點(diǎn)的文本內(nèi)容了,所以接下來的輸出結(jié)果正是節(jié)點(diǎn)的文本內(nèi)容。</p><p>接下來我們又嘗試選擇了head標(biāo)簽,結(jié)果也是標(biāo)簽加其內(nèi)部的所有內(nèi)容,再接下來選擇了p標(biāo)簽,不過這次情況比較特殊,我們發(fā)現(xiàn)結(jié)果是第一個(gè)p標(biāo)簽的內(nèi)容,后面的幾個(gè)p標(biāo)簽并沒有選擇到,也就是說,當(dāng)有多個(gè)標(biāo)簽時(shí),這種選擇方式只會(huì)選擇到第一個(gè)匹配的標(biāo)簽,其他的后面的標(biāo)簽都會(huì)忽略。</p><p>提取信息</p><p>在上面我們演示了調(diào)用string屬性來獲取文本的值,那我們要獲取標(biāo)簽屬性值怎么辦呢?獲取標(biāo)簽名怎么辦呢?下面我們來統(tǒng)一梳理一下信息的提取方式</p><p>獲取名稱</p><p>可以利用name屬性來獲取標(biāo)簽的名稱。還是以上面的文本為例,我們選取title標(biāo)簽,然后調(diào)用name屬性就可以得到標(biāo)簽名稱。</p><p>print(soup.title.name)</p><p>運(yùn)行結(jié)果:</p><p>title</p><p>獲取屬性</p><p>每個(gè)標(biāo)簽可能有多個(gè)屬性,比如id,class等等,我們選擇到這個(gè)節(jié)點(diǎn)元素之后,可以調(diào)用attrs獲取所有屬性。</p><p>print(soup.p.attrs)</p><p>print(soup.p.attrs['name'])</p><p>運(yùn)行結(jié)果:</p><p>{'class':['title'],'name':'dromouse'}</p><p>dromouse</p><p>可以看到attrs的返回結(jié)果是字典形式,把選擇的標(biāo)簽的所有屬性和屬性值組合成一個(gè)字典,接下來如果要獲取name屬性,就相當(dāng)于從字典中獲取某個(gè)鍵值,只需要用中括號(hào)加屬性名稱就可以得到結(jié)果了,比如獲取name屬性就可以通過attrs['name']得到相應(yīng)的屬性值。</p><p>其實(shí)這樣的寫法還有點(diǎn)繁瑣,還有一種更簡單的獲取方式,我們可以不用寫attrs,直接節(jié)點(diǎn)元素后面加中括號(hào),傳入屬性名就可以達(dá)到屬性值了,樣例如下:</p><p>print(soup.p['name'])</p><p>print(soup.p['class'])</p><p>運(yùn)行結(jié)果:</p><p>dromouse</p><p>['title']</p><p>在這里注意到有的返回結(jié)果是字符串,有的返回結(jié)果是字符串組成的列表。比如name屬性的值是唯一的,返回的結(jié)果就是單個(gè)字符串,而對于class,一個(gè)節(jié)點(diǎn)元素可能由多個(gè)class,所以返回的是列表,所以在實(shí)際處理過程中要注意判斷類型。</p><p>獲取內(nèi)容</p><p>可以利用string屬性獲取節(jié)點(diǎn)元素包含的文本內(nèi)容,比如上面的文本我們獲取第一個(gè)p標(biāo)簽的文本:</p><p>print(soup.p.string)</p><p>運(yùn)行結(jié)果:</p><p>The Dormouse's story</p><p>再次注意一下這里選擇到的p標(biāo)簽是第一個(gè)p標(biāo)簽,獲取的文本也就是第一個(gè)p標(biāo)簽里面的文本。</p><p>嵌套選擇</p><p>在上面的例子中我們知道每一個(gè)返回結(jié)果都是bs4.element.Tag類型,它同樣可以繼續(xù)調(diào)用標(biāo)簽進(jìn)行下一步的選擇,比如我們獲取了head節(jié)點(diǎn)元素,我們可以繼續(xù)調(diào)用head來選取其內(nèi)部的head節(jié)點(diǎn)元素。</p><p><img src="/upload/otherpic70/13717038-02c14afa65dc1135.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-39845be53a4886ff.png" alt="Python3中BeautifulSoup的使用方法"></p><p>第一行結(jié)果是我們調(diào)用了head之后再次調(diào)用了title來選擇的title節(jié)點(diǎn)元素,然后我們緊接著打印輸出了它的類型,可以看到它仍然是bs4.element.Tag類型,也就是說我們在Tag類型的基礎(chǔ)上再次選擇得到的依然還是Tag類型,每次返回的結(jié)果都相同,所以這樣我們就可以這樣做嵌套的選擇了。</p><p>最后輸出了一下它的string屬性,也就是標(biāo)簽里的文本內(nèi)容。</p><p>關(guān)聯(lián)選擇</p><p>我們在做選擇的時(shí)候有時(shí)候不能做到一步就可以選擇到想要的節(jié)點(diǎn)元素,有時(shí)候在選擇的時(shí)候需要先選中某一個(gè)節(jié)點(diǎn)元素,然后以它為基準(zhǔn)再選擇它的子節(jié)點(diǎn)、父節(jié)點(diǎn)、兄弟節(jié)點(diǎn)等等。所以在這里我們就介紹下如何來選擇這些節(jié)點(diǎn)元素。</p><p>子節(jié)點(diǎn)和子孫節(jié)點(diǎn)</p><p>選取到了一個(gè)節(jié)點(diǎn)元素之后,如果想要獲取它的直接子節(jié)點(diǎn)可以調(diào)用contents屬性,我們用一個(gè)實(shí)例來感受一下:</p><p><img src="/upload/otherpic70/13717038-49d219921a993301.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-0b37e0144d0414d7.png" alt="Python3中BeautifulSoup的使用方法"></p><p>返回的結(jié)果是列表形式,p標(biāo)簽里面既包含文本,又包含標(biāo)簽,返回的結(jié)果會(huì)將他們以列表形式都統(tǒng)一返回。</p><p>注意得到的列表的每一個(gè)元素都是p標(biāo)簽的直接子節(jié)點(diǎn),比如第一個(gè)a標(biāo)簽里面包含了一層span標(biāo)簽,這個(gè)就相當(dāng)于孫子節(jié)點(diǎn)了,但是返回結(jié)果中并沒有單獨(dú)把span標(biāo)簽選出來作為結(jié)果的一部分,所以說contents屬性得到的結(jié)果是直接子節(jié)點(diǎn)的列表。</p><p>同樣地我們可以調(diào)用children屬性,得到相應(yīng)的結(jié)果。</p><p><img src="/upload/otherpic70/13717038-d90f37728782dc3a.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-f9ffc931406b95dc.png" alt="Python3中BeautifulSoup的使用方法"></p><p>還是同樣的HTML文本,在這里我們調(diào)用了children屬性來進(jìn)行選擇,返回結(jié)果可以看到是生成器類型,所以接下來我們用for循環(huán)輸出了一下相應(yīng)的內(nèi)容,內(nèi)容其實(shí)是一樣的,只不過children返回的是生成器類型,而contents返回的是列表類型。</p><p>如果我們要得到所有的子孫節(jié)點(diǎn)的話可以調(diào)用descendants屬性。</p><p><img src="/upload/otherpic70/13717038-3443eb650c61c0e3.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-128e7789fce097dd.png" alt="Python3中BeautifulSoup的使用方法"></p><p>返回結(jié)果還是生成器,遍歷輸出一下可以看到這次的輸出結(jié)果就包含了span標(biāo)簽,descendants會(huì)遞歸地查詢所有子節(jié)點(diǎn),得到的是所有的子孫節(jié)點(diǎn)。</p><p>父節(jié)點(diǎn)和祖先節(jié)點(diǎn)</p><p>如果要獲取某個(gè)節(jié)點(diǎn)元素的父節(jié)點(diǎn),可以調(diào)用parent屬性。</p><p><img src="/upload/otherpic70/13717038-93fa3c8f0b7550d8.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-57360e0fd2e9e0af.png" alt="Python3中BeautifulSoup的使用方法"></p><p>在這里我們選擇的是第一個(gè)a標(biāo)簽的父節(jié)點(diǎn)元素,很明顯它的父節(jié)點(diǎn)是p標(biāo)簽,輸出結(jié)果便是p標(biāo)簽及其內(nèi)部的內(nèi)容。</p><p>注意到這里輸出的僅僅是a標(biāo)簽的直接父節(jié)點(diǎn),而沒有再向外尋找父節(jié)點(diǎn)的祖先節(jié)點(diǎn),如果我們要想獲取所有的祖先節(jié)點(diǎn),可以調(diào)用parents屬性。</p><p><img src="/upload/otherpic70/13717038-9eace2ed27741f4c.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-6e4e8f4903d227a2.png" alt="Python3中BeautifulSoup的使用方法"></p><p>返回結(jié)果是一個(gè)生成器類型,我們在這里用列表輸出了它的索引和內(nèi)容,可以發(fā)現(xiàn)列表中的元素就是a標(biāo)簽的祖先節(jié)點(diǎn)。</p><p>兄弟節(jié)點(diǎn)</p><p>上面說明了子節(jié)點(diǎn)和父節(jié)點(diǎn)的獲取方式,如果要獲取同級(jí)的節(jié)點(diǎn)也就是兄弟節(jié)點(diǎn)應(yīng)該怎么辦?我們先用一個(gè)實(shí)例來感受一下:</p><p><img src="/upload/otherpic70/13717038-dd3887969584ed08.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-a12a6e0fa4365ebc.png" alt="Python3中BeautifulSoup的使用方法"></p><p>可以看到在這里我們調(diào)用了四個(gè)不同的屬性,next_sibling和previous_sibling分別可以獲取節(jié)點(diǎn)的下一個(gè)和上一個(gè)兄弟元素,next_siblings和previous_siblings則分別返回所有前面和后面的兄弟節(jié)點(diǎn)的生成器。</p><p>提取信息</p><p>在上面我們講解了關(guān)聯(lián)元素節(jié)點(diǎn)的選擇方法,如果我們想要獲取它們的一些信息,比如文本、屬性等等也是同樣的方法。</p><p><img src="/upload/otherpic70/13717038-7dffe04b03eda4bd.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-a4600ccd1268663d.png" alt="Python3中BeautifulSoup的使用方法"></p><p>如果返回結(jié)果是單個(gè)節(jié)點(diǎn),那么可以直接調(diào)用string、attrs等屬性來獲得其文本和屬性,如果返回結(jié)果是多個(gè)節(jié)點(diǎn)的生成器,則可以轉(zhuǎn)為list后取出某個(gè)元素,然后再調(diào)用string、attrs等屬性來獲取其對應(yīng)節(jié)點(diǎn)等文本和屬性。</p><p>方法選擇器</p><p>前面我們所講的選擇方法都是用.這種運(yùn)算符來選擇元素的,這種選擇方法非??欤侨绻M(jìn)行比較復(fù)雜的選擇的話則會(huì)比較繁瑣,不夠靈活。所以BeautifulSoup還為我們提供了一些查詢的方法,比如find_all()、find()等方法,我們可以調(diào)用方法然后傳入相應(yīng)等參數(shù)就可以靈活地進(jìn)行查詢了。</p><p>最常用的查詢方法莫過于find_all()和find()了,下面我們對它們的用法進(jìn)行詳細(xì)的介紹。</p><p>find_all(name , attrs , recursive , text , **kwargs)</p><p>find_all,顧名思義,就是查詢所有符合條件的元素,可以給它傳入一些屬性或文本來得到符合條件的元素,功能十分強(qiáng)大。</p><p>name</p><p>我們可以根據(jù)標(biāo)簽名來查詢元素,下面我們用一個(gè)實(shí)例來感受一下:</p><p><img src="/upload/otherpic70/13717038-6c32ea879175f81c.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-eadca22d90c8758a.png" alt="Python3中BeautifulSoup的使用方法"></p><p>在這里我們調(diào)用了find_all()方法,傳入了一個(gè)name參數(shù),參數(shù)值為ul,也就是說我們想要查詢所有ul標(biāo)簽,返回結(jié)果是list類型,長度為2,每個(gè)元素依然都是bs4.element.Tag類型。</p><p>因?yàn)槎际荰ag類型,所以我們依然可以進(jìn)行嵌套查詢,還是同樣的文本,在這里我們查詢出所有ul標(biāo)簽后再繼續(xù)查詢其內(nèi)部的li標(biāo)簽。</p><p>forulinsoup.find_all(name='ul'):</p><p>print(ul.find_all(name='li'))</p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-0d7c848457772c2a.png" alt="Python3中BeautifulSoup的使用方法"></p><p>返回結(jié)果是列表類型,列表中的每個(gè)元素依然還是Tag類型。</p><p>接下來我們就可以遍歷每個(gè)li獲取它的文本了。</p><p><img src="/upload/otherpic70/13717038-655fddfbd575ef9c.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-ad7aaadf0073cd5f.png" alt="Python3中BeautifulSoup的使用方法"></p><p>attrs</p><p>除了根據(jù)標(biāo)簽名查詢,我們也可以傳入一些屬性來進(jìn)行查詢,我們用一個(gè)實(shí)例感受一下:</p><p><img src="/upload/otherpic70/13717038-4748268d06ce329c.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-2ae3808fafebd523.png" alt="Python3中BeautifulSoup的使用方法"></p><p>在這里我們查詢的時(shí)候傳入的是attrs參數(shù),參數(shù)的類型是字典類型,比如我們要查詢id為list-1的節(jié)點(diǎn),那就可以傳入attrs={'id': 'list-1'}的查詢條件,得到的結(jié)果是列表形式,包含的內(nèi)容就是符合id為list-1的所有節(jié)點(diǎn),上面的例子中符合條件的元素個(gè)數(shù)是1,所以結(jié)果是長度為1的列表。</p><p>對于一些常用的屬性比如id、class等,我們可以不用attrs來傳遞,比如我們要查詢id為list-1的節(jié)點(diǎn),我們可以直接傳入id這個(gè)參數(shù),還是上面的文本,我們換一種方式來查詢。</p><p><img src="/upload/otherpic70/13717038-9b8227bb3e6c6bcd.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-ff718955b7a9c81c.png" alt="Python3中BeautifulSoup的使用方法"></p><p>在這里我們直接傳入id='list-1'就可以查詢id為list-1的節(jié)點(diǎn)元素了。而對于class來說,由于class在python里是一個(gè)關(guān)鍵字,所以在這里后面需要加一個(gè)下劃線,class_='element',返回的結(jié)果依然還是Tag組成的列表。</p><p>text</p><p>text參數(shù)可以用來匹配節(jié)點(diǎn)的文本,傳入的形式可以是字符串,可以是正則表達(dá)式對象,我們用一個(gè)實(shí)例來感受一下:</p><p><img src="/upload/otherpic70/13717038-f26e2ab8549e5034.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p>['Hello, this is a link','Hello, this is a link, too']</p><p>在這里有兩個(gè)a節(jié)點(diǎn),其內(nèi)部包含有文本信息,在這里我們調(diào)用find_all()方法傳入text參數(shù),參數(shù)為正則表達(dá)式對象,結(jié)果會(huì)返回所有匹配正則表達(dá)式的節(jié)點(diǎn)文本組成的列表。</p><p>find(name , attrs , recursive , text , **kwargs)</p><p>除了find_all()方法,還有find()方法,只不過find()方法返回的是單個(gè)元素,也就是第一個(gè)匹配的元素,而find_all()返回的是所有匹配的元素組成的列表。</p><p><img src="/upload/otherpic70/13717038-a7129d84b80a4d05.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-466731c4a82aeae8.png" alt="Python3中BeautifulSoup的使用方法"></p><p>返回結(jié)果不再是列表形式,而是第一個(gè)匹配的節(jié)點(diǎn)元素,類型依然是Tag類型。</p><p>另外還有許多的查詢方法,用法與前面介紹的find_all()、find()方法完全相同,只不過查詢范圍不同,在此做一下簡單的說明。</p><p>find_parents() find_parent()</p><p>find_parents()返回所有祖先節(jié)點(diǎn),find_parent()返回直接父節(jié)點(diǎn)。</p><p>find_next_siblings() find_next_sibling()</p><p>find_next_siblings()返回后面所有兄弟節(jié)點(diǎn),find_next_sibling()返回后面第一個(gè)兄弟節(jié)點(diǎn)。</p><p>find_previous_siblings() find_previous_sibling()</p><p>find_previous_siblings()返回前面所有兄弟節(jié)點(diǎn),find_previous_sibling()返回前面第一個(gè)兄弟節(jié)點(diǎn)。</p><p>find_all_next() find_next()</p><p>find_all_next()返回節(jié)點(diǎn)后所有符合條件的節(jié)點(diǎn), find_next()返回第一個(gè)符合條件的節(jié)點(diǎn)。</p><p>find_all_previous() 和 find_previous()</p><p>find_all_previous()返回節(jié)點(diǎn)后所有符合條件的節(jié)點(diǎn), find_previous()返回第一個(gè)符合條件的節(jié)點(diǎn)</p><p>CSS選擇器</p><p>BeautifulSoup還提供了另外一種選擇器,那就是CSS選擇器,如果對web開發(fā)熟悉對話,CSS選擇器肯定也不陌生,如果不熟悉的話,可以看一下CSS選擇器參考手冊。</p><p>使用CSS選擇器,只需要調(diào)用select()方法,傳入相應(yīng)的CSS選擇器即可,我們用一個(gè)實(shí)例來感受一下:</p><p><img src="/upload/otherpic70/13717038-50447fc407fee191.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-c29afedbed634bcd.png" alt="Python3中BeautifulSoup的使用方法"></p><p>在這里我們用了三次CSS選擇器,返回的結(jié)果均是符合CSS選擇器的節(jié)點(diǎn)組成的列表。例如select('ul li')則是選擇所有ul節(jié)點(diǎn)下面的所有l(wèi)i節(jié)點(diǎn),結(jié)果便是所有的li節(jié)點(diǎn)組成的列表。</p><p>最后一句我們打印輸出了列表中元素的類型,可以看到類型依然是Tag類型。</p><p>嵌套選擇</p><p>select()方法同樣支持嵌套選擇,例如我們先選擇所有ul節(jié)點(diǎn),再遍歷每個(gè)ul節(jié)點(diǎn)選擇其li節(jié)點(diǎn),樣例如下:</p><p><img src="/upload/otherpic70/13717038-5bc23db3e8c238ef.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-459cd896a26e2f8b.png" alt="Python3中BeautifulSoup的使用方法"></p><p>可以看到正常輸出了遍歷每個(gè)ul節(jié)點(diǎn)之后,其下的所有l(wèi)i節(jié)點(diǎn)組成的列表。</p><p>獲取屬性</p><p>我們知道節(jié)點(diǎn)類型是Tag類型,所以獲取屬性還是可以用原來的方法獲取,仍然是上面的HTML文本,我們在這里嘗試獲取每個(gè)ul節(jié)點(diǎn)的id屬性。</p><p><img src="/upload/otherpic70/13717038-99289719b42e8005.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-28fa7f2f2fe486b3.png" alt="Python3中BeautifulSoup的使用方法"></p><p>可以看到直接傳入中括號(hào)和屬性名和通過attrs屬性獲取屬性值都是可以成功的。</p><p>獲取文本</p><p>那么獲取文本當(dāng)然也可以用前面所講的string屬性,還有一個(gè)方法那就是get_text(),同樣可以獲取文本值。</p><p><img src="/upload/otherpic70/13717038-1e1977e687fb1b56.png" alt="Python3中BeautifulSoup的使用方法"></p><p>運(yùn)行結(jié)果:</p><p><img src="/upload/otherpic70/13717038-d3d9c499a9630adc.png" alt="Python3中BeautifulSoup的使用方法"></p><p>二者的效果是完全一致的,都可以獲取到節(jié)點(diǎn)的文本值。</p><p>綜述</p><p>到此BeautifulSoup的使用介紹基本就結(jié)束了,最后做一下簡單的總結(jié):</p><p>推薦使用lxml解析庫,必要時(shí)使用html.parser</p><p>標(biāo)簽選擇篩選功能弱但是速度快</p><p>建議使用find()、find_all() 查詢匹配單個(gè)結(jié)果或者多個(gè)結(jié)果</p><p>如果對CSS選擇器熟悉的話可以使用select()選擇法</p> <br> 新聞標(biāo)題:Python3中BeautifulSoup的使用方法 <br> 文章地址:<a href="http://weahome.cn/article/pceoic.html">http://weahome.cn/article/pceoic.html</a> </div> </div> </div> <div id="squ6kqw" class="other container"> <h3>其他資訊</h3> <ul> <li> <a href="/article/jgipoe.html">Servlet:我還活著呢!</a> </li><li> <a href="/article/jgijjd.html">C++的define是什么</a> </li><li> <a href="/article/jgijsg.html">Docker容器磁盤占滿的情況有哪些</a> </li><li> <a href="/article/jgipoc.html">如何進(jìn)行AOP開發(fā)中的Java動(dòng)態(tài)代理</a> </li><li> <a href="/article/jgijgs.html">php中(foreach)用法介紹</a> </li> </ul> </div> <div id="squ6kqw" class="footer"> <div id="squ6kqw" class="foota container"> <div id="squ6kqw" class="foot_nav fl col-lg-8 col-md-8 col-sm-12 col-xs-12"> <ul> <li id="squ6kqw" class="col-lg-3 col-md-3 col-sm-3 col-xs-6"> <h3>網(wǎng)站制作</h3> <a target="_blank">溫江網(wǎng)站制作</a><a target="_blank">綿陽網(wǎng)站制作公司</a><a target="_blank">網(wǎng)站制作</a><a target="_blank">成都網(wǎng)站制作</a><a target="_blank">網(wǎng)站制作價(jià)格</a><a target="_blank">定制網(wǎng)站制作</a> </li> <li id="squ6kqw" class="col-lg-3 col-md-3 col-sm-3 col-xs-6"> <h3>企業(yè)服務(wù)</h3> <a target="_blank">網(wǎng)站快速收錄</a><a target="_blank">工商變更</a><a target="_blank">免費(fèi)建站</a><a target="_blank">軟文發(fā)布</a><a target="_blank">網(wǎng)站備案</a><a target="_blank">ssl證書</a> </li> <li id="squ6kqw" class="col-lg-3 col-md-3 col-sm-3 col-xs-6"> <h3>網(wǎng)站建設(shè)</h3> <a href="http://weahome.cn/mobile/" target="_blank">重慶移動(dòng)網(wǎng)站建設(shè)</a><a target="_blank">高端網(wǎng)站建設(shè)</a><a target="_blank">成都網(wǎng)站建設(shè)</a><a target="_blank">網(wǎng)站建設(shè)報(bào)價(jià)方案</a><a target="_blank">營銷網(wǎng)站建設(shè)</a><a target="_blank">企業(yè)網(wǎng)站建設(shè)</a> </li> <li id="squ6kqw" class="col-lg-3 col-md-3 col-sm-3 col-xs-6"> <h3>服務(wù)器托管</h3> <a target="_blank">光華服務(wù)器托管</a><a target="_blank">雅安服務(wù)器托管</a><a target="_blank">重慶服務(wù)器托管</a><a target="_blank">棕樹服務(wù)器托管</a><a target="_blank">貴陽聯(lián)通機(jī)房</a><a target="_blank">成都西云機(jī)房</a> </li> </ul> </div> <div id="squ6kqw" class="footar fl col-lg-4 col-md-4 col-sm-12 col-xs-12"> <p>全國免費(fèi)咨詢:</p> <b>400-028-6601</b> <p>業(yè)務(wù)咨詢:028-86922220 / 13518219792</p> <p>節(jié)假值班:18980820575 / 13518219792</p> <p>聯(lián)系地址:成都市太升南路288號(hào)錦天國際A幢1002號(hào)</p> </div> </div> <div id="squ6kqw" class="footb"> <div id="squ6kqw" class="copy container"> <div id="squ6kqw" class="fl">Copyright ? 成都創(chuàng)新互聯(lián)科技有限公司重慶分公司 <a target="_blank">渝ICP備2021005571號(hào)</a></div> <!--<div id="squ6kqw" class="fr"><a target="_blank">成都網(wǎng)站建設(shè)</a>:<a target="_blank">創(chuàng)新互聯(lián)</a></div>--> </div> </div> <div id="squ6kqw" class="link"> <div id="squ6kqw" class="container"> 友情鏈接:: <a target="_blank">成都網(wǎng)站建設(shè)</a> <a target="_blank">重慶網(wǎng)站建設(shè)</a> <a href="">四川網(wǎng)站建設(shè)</a> <a href="">重慶建設(shè)網(wǎng)站</a> <a target="_blank">移動(dòng)服務(wù)器托管</a> <a target="_blank">成都服務(wù)器托管</a> <a target="_blank">云服務(wù)器</a> <a target="_blank">廣告設(shè)計(jì)制作</a> <a target="_blank">重慶網(wǎng)頁設(shè)計(jì)</a> <a target="_blank">重慶做網(wǎng)站</a> <a target="_blank">重慶網(wǎng)站制作</a> <a href="">重慶網(wǎng)站建設(shè)</a> <a href="">重慶網(wǎng)站公司</a> <a href="">渝中網(wǎng)站制作</a> <a href="">重慶網(wǎng)站設(shè)計(jì)</a> </div> </div> </div> <div id="squ6kqw" class="foot"> <ul class="public-celan"> <li> <a target="_blank" class="a1 db tc"> <img src="/Public/Home/img/icon-23.png" alt="" class="db auto"> <span id="squ6kqw" class="span-txt">在線咨詢</span> </a> </li> <li> <a href="tel:18980820575" class="a1 db tc"> <img src="/Public/Home/img/icon-24.png" alt="" class="db auto"> <span id="squ6kqw" class="span-txt">電話咨詢</span> </a> </li> <li> <a target="_blank" href="tencent://message/?uin=1683211881&Site=&Menu=yes" class="a1 db tc"> <img src="/Public/Home/img/icon-25.png" alt="" class="db auto"> <span id="squ6kqw" class="span-txt">QQ咨詢</span> </a> </li> <li> <a target="_blank" href="tencent://message/?uin=532337155&Site=&Menu=yes" class="a1 db tc public-yuyue-up"> <img src="/Public/Home/img/icon-26.png" alt="" class="db auto"> <span id="squ6kqw" class="span-txt">預(yù)約顧問</span> </a> </li> </ul> </div> <div id="squ6kqw" class="customer"> <dl class="icon1"> <dt> <a href="tencent://message/?uin=1683211881&Site=&Menu=yes"> <i class="iconT"><img src="/Public/Home/img/QQ.png" alt=""></i> <p>在線咨詢</p> </a> </dt> </dl> <dl class="icon2"> <dt><i><img src="/Public/Home/img/weixin.png" alt=""></i><p>微信咨詢</p></dt> <dd><img src="/Public/Home/img/ewm.png"></dd> </dl> <dl class="icon3"> <dt><i><img src="/Public/Home/img/dianhua.png" alt=""></i><p>電話咨詢</p></dt> <dd> <p>028-86922220(工作日)</p> <p>18980820575(7×24)</p> </dd> </dl> <dl class="icon4"> <dt class="sShow"> <a href="tencent://message/?uin=244261566&Site=&Menu=yes"> <i><img src="/Public/Home/img/dengji.png" alt=""></i><p>提交需求</p> </a> </dt> </dl> <dl class="icon5"> <dt class="gotop"> <a href="#top"> <i><img src="/Public/Home/img/top.png" alt=""></i><p>返回頂部</p> </a> </dt> </dl> </div> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://weahome.cn/" title="真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆">真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆</a> <div class="friend-links"> </div> </div> </footer> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body><div id="2cyms" class="pl_css_ganrao" style="display: none;"><input id="2cyms"><strong id="2cyms"><optgroup id="2cyms"></optgroup></strong></input><code id="2cyms"></code><blockquote id="2cyms"></blockquote><em id="2cyms"><del id="2cyms"><dfn id="2cyms"></dfn></del></em><sup id="2cyms"></sup><menu id="2cyms"><noscript id="2cyms"><pre id="2cyms"></pre></noscript></menu><delect id="2cyms"><tr id="2cyms"><wbr id="2cyms"></wbr></tr></delect><code id="2cyms"><noframes id="2cyms"><ul id="2cyms"></ul></noframes></code><small id="2cyms"><option id="2cyms"><delect id="2cyms"></delect></option></small><samp id="2cyms"></samp><dd id="2cyms"></dd><rt id="2cyms"></rt><ul id="2cyms"></ul><small id="2cyms"></small><em id="2cyms"><del id="2cyms"><dfn id="2cyms"></dfn></del></em><dfn id="2cyms"></dfn><rt id="2cyms"><code id="2cyms"><noframes id="2cyms"></noframes></code></rt><th id="2cyms"><object id="2cyms"><small id="2cyms"></small></object></th><cite id="2cyms"></cite><pre id="2cyms"></pre><blockquote id="2cyms"></blockquote><menu id="2cyms"></menu><s id="2cyms"></s><center id="2cyms"><dd id="2cyms"><tbody id="2cyms"></tbody></dd></center><dfn id="2cyms"><source id="2cyms"><strong id="2cyms"></strong></source></dfn><tr id="2cyms"></tr><bdo id="2cyms"></bdo><dl id="2cyms"></dl><input id="2cyms"></input><input id="2cyms"><tbody id="2cyms"><em id="2cyms"></em></tbody></input><button id="2cyms"></button><kbd id="2cyms"></kbd><center id="2cyms"></center><ul id="2cyms"></ul><button id="2cyms"><samp id="2cyms"><tbody id="2cyms"></tbody></samp></button><th id="2cyms"><object id="2cyms"><bdo id="2cyms"></bdo></object></th><blockquote id="2cyms"></blockquote><em id="2cyms"></em><dl id="2cyms"><nav id="2cyms"><li id="2cyms"></li></nav></dl><cite id="2cyms"></cite><delect id="2cyms"></delect><tr id="2cyms"><acronym id="2cyms"><xmp id="2cyms"></xmp></acronym></tr><code id="2cyms"></code><acronym id="2cyms"><xmp id="2cyms"><tfoot id="2cyms"></tfoot></xmp></acronym><del id="2cyms"></del><input id="2cyms"></input><table id="2cyms"></table><small id="2cyms"><option id="2cyms"><delect id="2cyms"></delect></option></small><em id="2cyms"></em><tbody id="2cyms"><em id="2cyms"><del id="2cyms"></del></em></tbody><strong id="2cyms"><noframes id="2cyms"><abbr id="2cyms"></abbr></noframes></strong><acronym id="2cyms"><blockquote id="2cyms"><tfoot id="2cyms"></tfoot></blockquote></acronym><delect id="2cyms"><td id="2cyms"><li id="2cyms"></li></td></delect><abbr id="2cyms"></abbr><tr id="2cyms"></tr><small id="2cyms"></small><strike id="2cyms"></strike><fieldset id="2cyms"></fieldset><kbd id="2cyms"></kbd><td id="2cyms"></td><wbr id="2cyms"><cite id="2cyms"><menu id="2cyms"></menu></cite></wbr><center id="2cyms"><dd id="2cyms"><tbody id="2cyms"></tbody></dd></center><noscript id="2cyms"><acronym id="2cyms"><blockquote id="2cyms"></blockquote></acronym></noscript><noscript id="2cyms"></noscript><noframes id="2cyms"></noframes><blockquote id="2cyms"></blockquote><noscript id="2cyms"></noscript><input id="2cyms"><tbody id="2cyms"><em id="2cyms"></em></tbody></input><samp id="2cyms"></samp><strike id="2cyms"></strike><tr id="2cyms"></tr><small id="2cyms"></small><dfn id="2cyms"></dfn><em id="2cyms"></em><object id="2cyms"></object><button id="2cyms"></button><ul id="2cyms"></ul><kbd id="2cyms"></kbd><blockquote id="2cyms"></blockquote><button id="2cyms"></button><pre id="2cyms"></pre><em id="2cyms"></em><tr id="2cyms"></tr><cite id="2cyms"><table id="2cyms"><noscript id="2cyms"></noscript></table></cite><noscript id="2cyms"><acronym id="2cyms"><xmp id="2cyms"></xmp></acronym></noscript><tfoot id="2cyms"></tfoot><bdo id="2cyms"></bdo><input id="2cyms"><tbody id="2cyms"><em id="2cyms"></em></tbody></input><tbody id="2cyms"><s id="2cyms"><bdo id="2cyms"></bdo></s></tbody><dd id="2cyms"></dd><input id="2cyms"></input><cite id="2cyms"><table id="2cyms"><tr id="2cyms"></tr></table></cite><th id="2cyms"><object id="2cyms"><bdo id="2cyms"></bdo></object></th><option id="2cyms"></option><source id="2cyms"></source><input id="2cyms"><tbody id="2cyms"><noframes id="2cyms"></noframes></tbody></input><pre id="2cyms"></pre><tbody id="2cyms"><object id="2cyms"><bdo id="2cyms"></bdo></object></tbody><strong id="2cyms"></strong><fieldset id="2cyms"></fieldset><dfn id="2cyms"><source id="2cyms"><strong id="2cyms"></strong></source></dfn><object id="2cyms"><li id="2cyms"><option id="2cyms"></option></li></object><menu id="2cyms"></menu><dl id="2cyms"></dl><fieldset id="2cyms"></fieldset><button id="2cyms"></button><dl id="2cyms"></dl><small id="2cyms"></small><tbody id="2cyms"><em id="2cyms"><del id="2cyms"></del></em></tbody><strong id="2cyms"></strong><dfn id="2cyms"><source id="2cyms"><strong id="2cyms"></strong></source></dfn><delect id="2cyms"></delect><pre id="2cyms"></pre><s id="2cyms"><bdo id="2cyms"><abbr id="2cyms"></abbr></bdo></s><kbd id="2cyms"></kbd><input id="2cyms"></input><tbody id="2cyms"><object id="2cyms"><bdo id="2cyms"></bdo></object></tbody><noframes id="2cyms"><abbr id="2cyms"><center id="2cyms"></center></abbr></noframes><center id="2cyms"><samp id="2cyms"><tbody id="2cyms"></tbody></samp></center><xmp id="2cyms"></xmp><table id="2cyms"></table><acronym id="2cyms"></acronym><dfn id="2cyms"></dfn><xmp id="2cyms"></xmp><button id="2cyms"><samp id="2cyms"><tr id="2cyms"></tr></samp></button><kbd id="2cyms"></kbd><tbody id="2cyms"><wbr id="2cyms"><cite id="2cyms"></cite></wbr></tbody><wbr id="2cyms"></wbr><acronym id="2cyms"><blockquote id="2cyms"><tfoot id="2cyms"></tfoot></blockquote></acronym><menu id="2cyms"></menu><li id="2cyms"></li><table id="2cyms"></table><menu id="2cyms"></menu><abbr id="2cyms"><noscript id="2cyms"><acronym id="2cyms"></acronym></noscript></abbr><center id="2cyms"><th id="2cyms"><object id="2cyms"></object></th></center><tr id="2cyms"></tr><ul id="2cyms"></ul><del id="2cyms"></del><tr id="2cyms"></tr><blockquote id="2cyms"></blockquote><dl id="2cyms"></dl><xmp id="2cyms"></xmp><small id="2cyms"></small><kbd id="2cyms"></kbd><center id="2cyms"></center><center id="2cyms"><center id="2cyms"><th id="2cyms"></th></center></center><acronym id="2cyms"></acronym><acronym id="2cyms"><td id="2cyms"><strike id="2cyms"></strike></td></acronym><strong id="2cyms"></strong><optgroup id="2cyms"></optgroup></div> </html> <script> $(".con img").each(function(){ var src = $(this).attr("src"); //獲取圖片地址 var str=new RegExp("http"); var result=str.test(src); if(result==false){ var url = "https://www.cdcxhl.com"+src; //絕對路徑 $(this).attr("src",url); } }); window.onload=function(){ document.oncontextmenu=function(){ return false; } } </script>