Beautiful Soup4學(xué)習(xí)筆記(五):修改文檔樹

Beautiful Soup的強(qiáng)項(xiàng)是文檔樹的搜索,但同時(shí)也可以方便的修改文檔樹

修改tag的名稱和屬性

>>> soup = BeautifulSoup('<b class="boldest">Extremely bold</b>') 
>>> tag = soup.b 
>>> tag.name = "blockquote" 
>>> tag["class"] = "verybold" 
>>> tag["id"] = 1 
>>> tag 
<blockquote class="verybold" id="1">Extremely bold</blockquote>
>>> del tag["class"] 
>>> del tag["id"] 
>>> tag 
<blockquote>Extremely bold</blockquote>

修改 .string

給tag的 .string 屬性賦值,就相當(dāng)于用當(dāng)前的內(nèi)容替代了原來的內(nèi)容:

>>> markup = '<a >I linked to <i>example.com</i></a>' 
>>> soup = BeautifulSoup(markup) 
>>> tag = soup.a 
>>> tag.string = "New link text." 
>>> tag 
<a >New link text.</a>

注意: 如果當(dāng)前的tag包含了其它tag,那么給它的 .string 屬性賦值會(huì)覆蓋掉原有的所有內(nèi)容包括子tag

append()

Tag.append() 方法想tag中添加內(nèi)容,就好像Python的列表的 .append() 方法:

>>> soup = BeautifulSoup("<a>Foo</a>") 
>>> soup.a.append("Bar") 
>>> soup 
<html><body><a>FooBar</a></body></html>
>>> soup.a.contents 
['Foo', 'Bar']

NavigableString()和 .new_tag()

如果想添加一段文本內(nèi)容到文檔中也沒問題,可以調(diào)用Python的 append() 方法 或調(diào)用 NavigableString 的構(gòu)造方法:

soup = BeautifulSoup("<b></b>")
tag = soup.b
tag.append("Hello")
new_string = NavigableString(" there")
tag.append(new_string)
tag
# <b>Hello there.</b>
tag.contents
# [u'Hello', u' there']

注意:這里我輸入時(shí)報(bào)錯(cuò)绘证,好像 NavigableString未生效链快。

如果想要?jiǎng)?chuàng)建一段注釋,或 NavigableString 的任何子類, 只要調(diào)用 NavigableString 的構(gòu)造方法:

>>> from bs4 import Comment 
>>> new_comment = soup.new_string("Nice to see you.", Comment) 
>>> tag.append(new_comment) 
>>> tag 
<b>Hello<!--Nice to see you.--></b>

創(chuàng)建一個(gè)tag最好的方法是調(diào)用工廠方法 BeautifulSoup.new_tag() :

>>> soup = BeautifulSoup("<b></b>")  
>>> original_tag = soup.b 
>>> new_tag = soup.new_tag("a",)
>>> original_tag.append(new_tag) 
>>> original_tag 
<b><a ></a></b>
>>> new_tag.string = "Link text." 
>>> original_tag  
<b><a >Link text.</a></b>

注意:第一個(gè)參數(shù)作為tag的name,是必填,其它參數(shù)選填

insert()

Tag.insert() 方法與 Tag.append() 方法類似,區(qū)別是不會(huì)把新元素添加到父節(jié)點(diǎn) .contents 屬性的最后,而是把元素插入到指定的位置.與Python列表總的 .insert() 方法的用法下同:

>>> markup = '<a >I linked to <i>example.com</i></a>' 
>>> soup = BeautifulSoup(markup)  
>>> tag = soup.a 
>>> tag.insert(1,"but did not endorse ") 
>>> tag 
<a >I linked to but did not endorse <i>example.com</i></a>
>>> tag.contents 
['I linked to ', 'but did not endorse ', <i>example.com</i>]

insert_before() 和 insert_after()

insert_before() 方法在當(dāng)前tag或文本節(jié)點(diǎn)前插入內(nèi)容:

>>> soup = BeautifulSoup("<b>stop</b>") 
>>> tag = soup.new_tag("i") 
>>> tag.string = "Don't" 
>>> soup.b.string.insert_before(tag) 
>>> soup.b 
<b><i>Don't</i>stop</b>

insert_after() 方法在當(dāng)前tag或文本節(jié)點(diǎn)后插入內(nèi)容:

>>> soup.b.i.insert_after(soup.new_string(" ever "))
>>> soup.b
<b><i>Don't</i> ever stop</b>
>>> soup.b.contents 
[<i>Don't</i>, ' ever ', 'stop']

clear()

Tag.clear() 方法移除當(dāng)前tag的內(nèi)容:

>>> markup = '<a >I linked to <i>example.com</i></a>' 
>>> soup = BeautifulSoup(markup) 
>>> tag = soup.a
>>> tag.clear() 
>>> tag 
<a ></a>

extract()

PageElement.extract()方法將當(dāng)前tag移除文檔樹,并作為方法結(jié)果返回:

>>> markup = '<a >I linked to <i>example.com</i></a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a 
>>> i_tag = soup.i.extract() 
>>> a_tag 
<a >I linked to </a>
>>> i_tag 
<i>example.com</i>
>>> print(i_tag.parent)
None

這個(gè)方法實(shí)際上產(chǎn)生了2個(gè)文檔樹: 一個(gè)是用來解析原始文檔的 BeautifulSoup 對(duì)象,另一個(gè)是被移除并且返回的tag.被移除并返回的tag可以繼續(xù)調(diào)用 extract 方法:

>>> my_string = i_tag.string.extract()
>>> my_string 
'example.com'
>>> print(my_string.parent)
None
>>> i_tag 
<i></i>

decompose()

Tag.decompose() 方法將當(dāng)前節(jié)點(diǎn)移除文檔樹并完全銷毀:

>>> markup = '<a >I linked to <i>example.com</i></a>' 
>>> soup = BeautifulSoup(markup) 
>>> a_tag = soup.a 
>>> soup.i.decompose() 
>>> a_tag 
<a >I linked to </a>

replace_with()

PageElement.replace_with() 方法移除文檔樹中的某段內(nèi)容,并用新tag或文本節(jié)點(diǎn)替代它:

>>> markup = '<a >I linked to <i>example.com</i></a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>> new_tag = soup.new_tag("b") 
>>> new_tag.string ="example.net" 
>>> a_tag.i.replace_with(new_tag) 
<i>example.com</i>
>>> a_tag 
<a >I linked to <b>example.net</b></a>

replace_with() 方法返回被替代的tag或文本節(jié)點(diǎn),可以用來瀏覽或添加到文檔樹其它地方

wrap()

PageElement.wrap() 方法可以對(duì)指定的tag元素進(jìn)行包裝 ,并返回包裝后的結(jié)果:

>>> soup = BeautifulSoup("<p>I wish I was bold.</p>") 
>>> soup.p.string.wrap(soup.new_tag("b"))
<b>I wish I was bold.</b>
>>> soup.p.wrap(soup.new_tag("div")) 
<div><p><b>I wish I was bold.</b></p></div>

unwrap()

Tag.unwrap() 方法與 wrap() 方法相反.將移除tag內(nèi)的所有tag標(biāo)簽,該方法常被用來進(jìn)行標(biāo)記的解包:

>>> markup = '<a >I linked to <i>example.com</i></a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>> a_tag.i.unwrap() 
<i></i>
>>> a_tag 
<a >I linked to example.com</a>

與 replace_with() 方法相同, unwrap() 方法返回被移除的tag

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甚带,一起剝皮案震驚了整個(gè)濱河市边翼,隨后出現(xiàn)的幾起案子肃弟,更是在濱河造成了極大的恐慌膜钓,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醋拧,死亡現(xiàn)場(chǎng)離奇詭異慷嗜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丹壕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門庆械,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菌赖,你說我怎么就攤上這事缭乘。” “怎么了琉用?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵堕绩,是天一觀的道長。 經(jīng)常有香客問我邑时,道長奴紧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任刁愿,我火速辦了婚禮绰寞,結(jié)果婚禮上到逊,老公的妹妹穿的比我還像新娘铣口。我一直安慰自己滤钱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布脑题。 她就那樣靜靜地躺著件缸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叔遂。 梳的紋絲不亂的頭發(fā)上他炊,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音已艰,去河邊找鬼痊末。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哩掺,可吹牛的內(nèi)容都是我干的凿叠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼嚼吞,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盒件!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舱禽,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤炒刁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后誊稚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翔始,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年里伯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绽昏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俏脊,死狀恐怖全谤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爷贫,我是刑警寧澤认然,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站漫萄,受9級(jí)特大地震影響卷员,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腾务,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一毕骡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦未巫、人聲如沸窿撬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劈伴。三九已至,卻和暖如春握爷,著一層夾襖步出監(jiān)牢的瞬間跛璧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工新啼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留追城,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓燥撞,卻偏偏與公主長得像漓柑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叨吮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容