Beautiful Soup4学习笔记(五):修改文档树

Beautiful Soup的强项是文档树的搜索,但同时也可以方便的修改文档树

修改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 属性赋值,就相当于用当前的内容替代了原来的内容:

>>> 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 属性赋值会覆盖掉原有的所有内容包括子tag

append()

Tag.append() 方法想tag中添加内容,就好像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()

如果想添加一段文本内容到文档中也没问题,可以调用Python的 append() 方法 或调用 NavigableString 的构造方法:

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 的任何子类, 只要调用 NavigableString 的构造方法:

>>> 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>

创建一个tag最好的方法是调用工厂方法 BeautifulSoup.new_tag() :

>>> 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 
['I linked to ', '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>, ' ever ', '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 
'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) 
<i>example.com</i>
>>> a_tag 
<a href="http://example.com/">I linked to <b>example.net</b></a>

replace_with() 方法返回被替代的tag或文本节点,可以用来浏览或添加到文档树其它地方

wrap()

PageElement.wrap() 方法可以对指定的tag元素进行包装 ,并返回包装后的结果:

>>> 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内的所有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() 
<i></i>
>>> a_tag 
<a href="http://example.com/">I linked to example.com</a>

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容