修改文檔樹
Beautiful Soup的強項是文檔樹的搜索,但同時也能夠方便的修改文檔樹html
修改tag的名稱和屬性
在 Attributes 的章節中已經介紹過這個功能,可是再看一遍也無妨. 重命名一個tag,改變屬性的值,添加或刪除屬性:python
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
屬性賦值,就至關於用當前的內容替代了原來的內容:app
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
tag = soup.a
tag.string = "New link text."
tag
# <a href="http://example.com/">New link text.</a>
注意: 若是當前的tag包含了其它tag,那麼給它的 .string
屬性賦值會覆蓋掉原有的全部內容包括子tagspa
append()
Tag.append()
方法想tag中添加內容,就好像Python的列表的 .append()
方法:.net
soup = BeautifulSoup("<a>Foo</a>")
soup.a.append("Bar")
soup
# <html><head></head><body><a>FooBar</a></body></html>
soup.a.contents
# [u'Foo', u'Bar']
NavigableString() 和 .new_tag()
若是想添加一段文本內容到文檔中也沒問題,能夠調用Python的 append()
方法 或調用 NavigableString
的構造方法:code
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']
若是想要建立一段註釋,或 NavigableString
的任何子類, 只要調用 NavigableString 的構造方法:htm
from bs4 import Comment
new_comment = soup.new_string("Nice to see you.", Comment)
tag.append(new_comment)
tag
# <b>Hello there<!--Nice to see you.--></b>
tag.contents
# [u'Hello', u' there', u'Nice to see you.']
# 這是Beautiful Soup 4.2.1 中新增的方法對象
建立一個tag最好的方法是調用工廠方法 BeautifulSoup.new_tag()
:rem
soup = BeautifulSoup("<b></b>")
original_tag = soup.b
new_tag = soup.new_tag("a", href="http://www.example.com")
original_tag.append(new_tag)
original_tag
# <b><a href="http://www.example.com"></a></b>
new_tag.string = "Link text."
original_tag
# <b><a href="http://www.example.com">Link text.</a></b>
第一個參數做爲tag的name,是必填,其它參數選填文檔
insert()
Tag.insert()
方法與 Tag.append()
方法相似,區別是不會把新元素添加到父節點 .contents
屬性的最後,而是把元素插入到指定的位置.與Python列表總的 .insert()
方法的用法下同:
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
tag = soup.a
tag.insert(1, "but did not endorse ")
tag
# <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a>
tag.contents
# [u'I linked to ', u'but did not endorse', <i>example.com</i>]
insert_before() 和 insert_after()
insert_before()
方法在當前tag或文本節點前插入內容:
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()
方法在當前tag或文本節點後插入內容:
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>, u' ever ', u'stop']
clear()
Tag.clear()
方法移除當前tag的內容:
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
tag = soup.a
tag.clear()
tag
# <a href="http://example.com/"></a>
extract()
PageElement.extract()
方法將當前tag移除文檔樹,並做爲方法結果返回:
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
a_tag = soup.a
i_tag = soup.i.extract()
a_tag
# <a href="http://example.com/">I linked to</a>
i_tag
# <i>example.com</i>
print(i_tag.parent)
None
這個方法實際上產生了2個文檔樹: 一個是用來解析原始文檔的 BeautifulSoup
對象,另外一個是被移除而且返回的tag.被移除並返回的tag能夠繼續調用 extract
方法:
my_string = i_tag.string.extract()
my_string
# u'example.com'
print(my_string.parent)
# None
i_tag
# <i></i>
decompose()
Tag.decompose()
方法將當前節點移除文檔樹並徹底銷燬:
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
a_tag = soup.a
soup.i.decompose()
a_tag
# <a href="http://example.com/">I linked to</a>
replace_with()
PageElement.replace_with()
方法移除文檔樹中的某段內容,並用新tag或文本節點替代它:
markup = '<a href="http://example.com/">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)
a_tag
# <a href="http://example.com/">I linked to <b>example.net</b></a>
replace_with()
方法返回被替代的tag或文本節點,能夠用來瀏覽或添加到文檔樹其它地方
wrap()
PageElement.wrap()
方法能夠對指定的tag元素進行包裝 [8] ,並返回包裝後的結果:
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>
該方法在 Beautiful Soup 4.0.5 中添加
unwrap()
Tag.unwrap()
方法與 wrap()
方法相反.將移除tag內的全部tag標籤,該方法常被用來進行標記的解包:
markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
a_tag = soup.a
a_tag.i.unwrap()
a_tag
# <a href="http://example.com/">I linked to example.com</a>
與 replace_with()
方法相同, unwrap()
方法返回被移除的tag
輸出
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">