最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

html結(jié)構(gòu)解析—Beautiful Soup 定位指南

2023-03-17 21:13 作者:biggertree-Jing  | 我要投稿

轉(zhuǎn)載自:?

http://blog.csdn.net/abclixu123/article/details/38502993


網(wǎng)頁中有用的信息通常存在于網(wǎng)頁中的文本或各種不同標(biāo)簽的屬性值,為了獲得這些網(wǎng)頁信息,有必要有一些查找方法可以獲取這些文本值或標(biāo)簽屬性。而Beautiful Soup中內(nèi)置了一些查找方式:

find()

find_all()

find_parent()

find_parents()

find_next_sibling()

find_next_siblings()

find_previous_sibling()

find_previous_siblings()

find_previous()

find_all_previous()

find_next()

find_all_next()

使用find()查找

以下這段HTML是例程要用到的參考網(wǎng)頁

以上代碼是一個(gè)生態(tài)金字塔的簡(jiǎn)單展示,為了找到其中的第一生產(chǎn)者,第一消費(fèi)者或第二消費(fèi)者,我們可以使用Beautiful Soup的查找方法。一般來說,為了找到BeautifulSoup對(duì)象內(nèi)任何第一個(gè)標(biāo)簽入口,我們可以使用find()方法。

找到第一生產(chǎn)者

可以明顯看到,生產(chǎn)者在第一個(gè)標(biāo)簽里,因?yàn)樯a(chǎn)者是在整個(gè)HTML文檔中第一個(gè)標(biāo)簽中出現(xiàn),所以可以簡(jiǎn)單的使用find()方法找到第一生產(chǎn)者。下圖HTML樹代表了第一個(gè)生產(chǎn)者所在位置。


然后在ecologicalpyramid.py中寫入下面一段代碼,使用ecologicalpyramid.html文件創(chuàng)建BeautifulSoup對(duì)象。

輸出得到:plants

find()說明

find()函數(shù)如下:

find(name,attrs,recursive,text,**wargs)

這些參數(shù)相當(dāng)于過濾器一樣可以進(jìn)行篩選處理。

不同的參數(shù)過濾可以應(yīng)用到以下情況:

查找標(biāo)簽,基于name參數(shù)

查找文本,基于text參數(shù)

基于正則表達(dá)式的查找

查找標(biāo)簽的屬性,基于attrs參數(shù)

基于函數(shù)的查找

通過標(biāo)簽查找

我們可以傳遞任何標(biāo)簽的名字來查找到它第一次出現(xiàn)的地方。找到后,find函數(shù)返回一個(gè)BeautifulSoup的標(biāo)簽對(duì)象。

輸出的得到?<class 'bs4.element.Tag'>

通過文本查找

直接字符串的話,查找的是標(biāo)簽。如果想要查找文本的話,則需要用到text參數(shù)。如下所示:

輸出:plants

通過正則表達(dá)式查找

有以下HTML代碼:

如果想找出第一個(gè)郵箱地址,但是由于第一個(gè)郵箱地址沒有標(biāo)簽包含,所以通過其他方式很難找到。但是我們可以把郵箱地址進(jìn)行正則表達(dá)式處理,這樣就容易多了。

參考如下代碼:

輸出:abc@example.com

通過標(biāo)簽屬性進(jìn)行查找

觀看例程HTML代碼,其中第一消費(fèi)者在ul標(biāo)簽里面且id屬性為priaryconsumers.

因?yàn)榈谝幌M(fèi)者出現(xiàn)的ul不是文檔中第一個(gè)ul,所以通過前面查找標(biāo)簽的辦法就行不通了?,F(xiàn)在通過標(biāo)簽屬性進(jìn)行查找,參考代碼如下:

輸出:deer

通過標(biāo)簽屬性查找的方式適用于大多數(shù)標(biāo)簽屬性,包括id,style,title,但是有一組標(biāo)簽屬性例外。

Custom attrbutes

Class

此時(shí),我們需要借助attrs參數(shù)來進(jìn)行傳遞。

基于定制屬性的查找

比如我們HTML5標(biāo)簽中的data-custom屬性,如果我們這樣

那么則會(huì)報(bào)錯(cuò)。原因是在Python中變量不能呢含有-這個(gè)字符,而我們傳遞的data-custom有-這個(gè)字符。

解決的辦法是在attrs屬性用字典進(jìn)行傳遞參數(shù)。

基于CSS類的查找

因?yàn)閏lass是Python的保留關(guān)鍵字,所以無法使用class這個(gè)關(guān)鍵字。所以解決辦法類似上面。

還有另一個(gè)辦法。BeautifulSoup有一個(gè)特別的關(guān)鍵字參數(shù)class_。示例:

方法1:

方法2:

基于定義的函數(shù)進(jìn)行查找

可以傳遞函數(shù)到find()來基于函數(shù)定義的條件進(jìn)行查找。函數(shù)值必須返回true或者false。

例子:

輸出:fox

把方法進(jìn)行組合后進(jìn)行查找

可以用其中任何方法進(jìn)行組合來進(jìn)行查找,比如同時(shí)基于標(biāo)簽名和id號(hào)。

使用find_all查找

find()用來查找第一個(gè)匹配結(jié)果出現(xiàn)的地方,而find_all()正如名字所示,將會(huì)找到所有匹配結(jié)果出現(xiàn)的地方。應(yīng)用到find()中的不同過濾參數(shù)同理可以用到find_all()中,實(shí)際上,過濾參數(shù)可以用于任何查找函數(shù),如find_parents()或和find_siblings()。

查找所有三級(jí)消費(fèi)者

其all_tertiaryconsumers的類型是列表。

所以我們對(duì)其列表進(jìn)行迭代,循環(huán)輸出三級(jí)消費(fèi)者的名字。

輸出:

lion

tiger

理解用于find_all()的參數(shù)

相比find(),find_all()有個(gè)額外的參數(shù)limit,如下所示:

find_all(name,attrs,recursive,text,limit,**kwargs)

limit參數(shù)可以限制我們想要得到結(jié)果的數(shù)目。參照前面的郵件地址例子,我們可以得到所有右鍵地址通過:

輸出:[u'abc@example.com',u'xyz@example.com',u'foo@example.com']

當(dāng)我們使用limit參數(shù),效果如下:

限制得到兩個(gè)結(jié)果,所以輸出為:

[u'abc@example.com',u'xyz@example.com']

說白了,find()也就是當(dāng)limit=1時(shí)的find_all()。

可以向find函數(shù)傳遞True或False參數(shù),如果我們傳遞True給find_all(),則返回所有soup對(duì)象的標(biāo)簽。對(duì)于find()來說,則返回第一個(gè)標(biāo)簽。

舉例查找文本,傳遞True將會(huì)返回所有文本。

輸出:

[u'\n', u'\n', u'\n', u'\n', u'\n', u'plants', u'\n', u'100000',

u'\n', u'\n', u'\n', u'algae', u'\n', u'100000', u'\n', u'\n',

u'\n', u'\n', u'\n', u'deer', u'\n', u'1000', u'\n', u'\n',

u'\n', u'rabbit', u'\n', u'2000', u'\n', u'\n', u'\n',

u'\n', u'\n', u'fox', u'\n', u'100', u'\n', u'\n', u'\n',

u'bear', u'\n', u'100', u'\n', u'\n', u'\n', u'\n',

u'\n', u'lion', u'\n', u'80', u'\n', u'\n', u'\n',

u'tiger', u'\n', u'50', u'\n', u'\n', u'\n', u'\n',

u'\n']

同樣的,我們可以在傳遞text參數(shù)時(shí)傳遞一個(gè)字符串列表,那么find_all()會(huì)找到誒個(gè)在列表中定義過的字符串。

輸出:

這個(gè)同樣適用于查找標(biāo)簽,標(biāo)簽屬性,定制屬性和CSS類。如:

find()和find_all()都會(huì)查找一個(gè)對(duì)象所有后輩們,不過我們可以控制它通過recursive參數(shù)。如果recursive=False,那么查找只會(huì)找到該對(duì)象的最近后代。

通過標(biāo)簽之間的關(guān)系進(jìn)行查找

我們可以通過find()和find_all()來查找到想要內(nèi)容。但有時(shí)候,我們需要查看的與之內(nèi)容相關(guān)先前的標(biāo)簽或者后面的標(biāo)簽來獲取額外的信息。比如方法find_parents()和find_next_siblings()等等。一般的,在find()和find_all()方法后使用上述方法,因?yàn)閒ind()和find_all()可以找到特殊的一個(gè)標(biāo)簽,然后我們可以通過這個(gè)特殊的標(biāo)簽找到其他的想要的與之有關(guān)系的標(biāo)簽。

查找父標(biāo)簽

通過find_parents()或find_parent()。它們之間的不同就類似于find()和find_all()的區(qū)別。find_parents()返回全部的相匹配的父標(biāo)簽,而find_paret()返回最近的一個(gè)父標(biāo)簽。適用于find()的方法同樣也使用于這兩個(gè)方法。

在前面的第一消費(fèi)者例子中,我們可以找到離Primaryconsumer最近的ul父標(biāo)簽。

一個(gè)簡(jiǎn)單的找到一個(gè)標(biāo)簽的父標(biāo)簽的方法就是使用find_parent()卻不帶任何參數(shù)。

查找同胞

如果標(biāo)簽在同一個(gè)等級(jí)的話,我們可以說這些標(biāo)簽是同胞的關(guān)系,比如參照上面金字塔例子,所有ul標(biāo)簽就是同胞的關(guān)系。

上圖ul標(biāo)簽下的producers,primaryconsumers,secondaryconsumers,teriaryconsumers就是同胞關(guān)系。

再看下面這個(gè)圖:

div下的plants和algae不是同胞關(guān)系,但是plants和臨近的number是同胞關(guān)系。

Beautiful Soup自帶有查找同胞的方法。

比如find_next_siblings()和find_next_sibling()查找對(duì)象下面的同胞。舉例:

將會(huì)輸出與之臨近的下面的所有同胞HTML代碼。

查找下一個(gè)

對(duì)每一個(gè)標(biāo)簽來說,下一個(gè)元素可能會(huì)是定位字符串,標(biāo)簽對(duì)象或者其他BeautifulSoup對(duì)象。我們定義下一個(gè)元素為與當(dāng)前元素最靠近的元素。這個(gè)不同于同胞定義。我們有方法可以找到我們想要標(biāo)簽的下一個(gè)其他元素對(duì)象。find_all_next()找到與當(dāng)前元素靠近的所有對(duì)象。而find_next()找到離當(dāng)前元素最接近的對(duì)象。

比如,找到在第一個(gè)div標(biāo)簽后的所有l(wèi)i標(biāo)簽

輸出“:

[<li class="producerlist">

<div class="name">plants</div>

<div class="number">100000</div>

</li>, <li class="producerlist">

<div class="name">algae</div>

<div class="number">100000</div>

</li>, <li class="primaryconsumerlist">

<div class="name">deer</div>

<div class="number">1000</div>

</li>, <li class="primaryconsumerlist">

<div class="name">rabbit</div>

<div class="number">2000</div>

</li>, <li class="secondaryconsumerlist">

<div class="name">fox</div>

<div class="number">100</div>

</li>, <li class="secondaryconsumerlist">

<div class="name">bear</div>

<div class="number">100</div>

</li>, <li class="tertiaryconsumerlist">

<div class="name">lion</div>

<div class="number">80</div>

</li>, <li class="tertiaryconsumerlist">

<div class="name">tiger</div>

<div class="number">50</div>

</li>]

查找上一個(gè)

與查找下一個(gè)相反的是查找前一個(gè)。同理用于find_all_previous()和find_all_previous()

html結(jié)構(gòu)解析—Beautiful Soup 定位指南的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
闽清县| 伊金霍洛旗| 西华县| 广汉市| 怀化市| 荔波县| 佛山市| 富裕县| 侯马市| 汝城县| 桃源县| 鄄城县| 基隆市| 公安县| 六枝特区| 大英县| 滕州市| 西安市| 贡山| 竹北市| 武冈市| 福州市| 江源县| 海盐县| 江阴市| 习水县| 萨嘎县| 化州市| 海阳市| 罗江县| 红原县| 厦门市| 清苑县| 河东区| 洛南县| 巴中市| 苍山县| 嵊泗县| 石林| 万安县| 尉氏县|