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