Python BeautifulSoup修改文档树|修改tag的名称属性,append添加文本,insert插入元素,clear移除,wrap添加标签

发表时间:2019-12-16

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


修改tag的名称和属性

 重命名一个tag,改变属性的值,添加或删除属性:

  1. soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
  2. tag = soup.b
  3.  
  4. tag.name = "blockquote"
  5. tag['class'] = 'verybold'
  6. tag['id'] = 1
  7. tag
  8. # <blockquote class="verybold" id="1">Extremely bold</blockquote>
  9.  
  10. del tag['class']
  11. del tag['id']
  12. tag
  13. # <blockquote>Extremely bold</blockquote>


修改 .string

给tag的 .string 属性赋值,就相当于用当前的内容替代了原来的内容:

  1. markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
  2. soup = BeautifulSoup(markup)
  3.  
  4. tag = soup.a
  5. tag.string = "New link text."
  6. tag
  7. # <a href="http://example.com/">New link text.</a>

注意: 如果当前的tag包含了其它tag,那么给它的 .string 属性赋值会覆盖掉原有的所有内容包括子tag


append()

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

  1. soup = BeautifulSoup("<a>Foo</a>")
  2. soup.a.append("Bar")
  3.  
  4. soup
  5. # <html><head></head><body><a>FooBar</a></body></html>
  6. soup.a.contents
  7. # [u'Foo', u'Bar']


BeautifulSoup.new_string() 和 .new_tag()

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

  1. soup = BeautifulSoup("<b></b>")
  2. tag = soup.b
  3. tag.append("Hello")
  4. new_string = soup.new_string(" there")
  5. tag.append(new_string)
  6. tag
  7. # <b>Hello there.</b>
  8. tag.contents
  9. # [u'Hello', u' there']

如果想要创建一段注释,或 NavigableString 的任何子类,将子类作为 new_string() 方法的第二个参数传入:

  1. from bs4 import Comment
  2. new_comment = soup.new_string("Nice to see you.", Comment)
  3. tag.append(new_comment)
  4. tag
  5. # <b>Hello there<!--Nice to see you.--></b>
  6. tag.contents
  7. # [u'Hello', u' there', u'Nice to see you.']

# 这是Beautiful Soup 4.2.1 中新增的方法

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

  1. soup = BeautifulSoup("<b></b>")
  2. original_tag = soup.b
  3.  
  4. new_tag = soup.new_tag("a", href="http://www.example.com")
  5. original_tag.append(new_tag)
  6. original_tag
  7. # <b><a href="http://www.example.com"></a></b>
  8.  
  9. new_tag.string = "Link text."
  10. original_tag
  11. # <b><a href="http://www.example.com">Link text.</a></b>

第一个参数作为tag的name,是必填,其它参数选填


insert()

Tag.insert() 方法与 Tag.append() 方法类似,区别是不会把新元素添加到父节点 .contents 属性的最后,而是把元素插入到指定的位置.与Python列表总的 .insert() 方法的用法下同:

  1. markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
  2. soup = BeautifulSoup(markup)
  3. tag = soup.a
  4.  
  5. tag.insert(1, "but did not endorse ")
  6. tag
  7. # <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a>
  8. tag.contents
  9. # [u'I linked to ', u'but did not endorse', <i>example.com</i>]


insert_before() 和 insert_after()

insert_before() 方法在当前tag或文本节点前插入内容:

  1. soup = BeautifulSoup("<b>stop</b>")
  2. tag = soup.new_tag("i")
  3. tag.string = "Don't"
  4. soup.b.string.insert_before(tag)
  5. soup.b
  6. # <b><i>Don't</i>stop</b>

insert_after() 方法在当前tag或文本节点后插入内容:

  1. soup.b.i.insert_after(soup.new_string(" ever "))
  2. soup.b
  3. # <b><i>Don't</i> ever stop</b>
  4. soup.b.contents
  5. # [<i>Don't</i>, u' ever ', u'stop']


clear()

Tag.clear() 方法移除当前tag的内容:

  1. markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
  2. soup = BeautifulSoup(markup)
  3. tag = soup.a
  4.  
  5. tag.clear()
  6. tag
  7. # <a href="http://example.com/"></a>


extract()

PageElement.extract() 方法将当前tag移除文档树,并作为方法结果返回:

  1. markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
  2. soup = BeautifulSoup(markup)
  3. a_tag = soup.a
  4.  
  5. i_tag = soup.i.extract()
  6.  
  7. a_tag
  8. # <a href="http://example.com/">I linked to</a>
  9.  
  10. i_tag
  11. # <i>example.com</i>
  12.  
  13. print(i_tag.parent)
  14. None

这个方法实际上产生了2个文档树: 一个是用来解析原始文档的 BeautifulSoup 对象,另一个是被移除并且返回的tag.被移除并返回的tag可以继续调用 extract 方法:

  1. my_string = i_tag.string.extract()
  2. my_string
  3. # u'example.com'
  4.  
  5. print(my_string.parent)
  6. # None
  7. i_tag
  8. # <i></i>


decompose()

Tag.decompose() 方法将当前节点移除文档树并完全销毁:

  1. markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
  2. soup = BeautifulSoup(markup)
  3. a_tag = soup.a
  4.  
  5. soup.i.decompose()
  6.  
  7. a_tag
  8. # <a href="http://example.com/">I linked to</a>


replace_with()

PageElement.replace_with() 方法移除文档树中的某段内容,并用新tag或文本节点替代它:

  1. markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
  2. soup = BeautifulSoup(markup)
  3. a_tag = soup.a
  4.  
  5. new_tag = soup.new_tag("b")
  6. new_tag.string = "example.net"
  7. a_tag.i.replace_with(new_tag)
  8.  
  9. a_tag
  10. # <a href="http://example.com/">I linked to <b>example.net</b></a>

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


wrap()

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

  1. soup = BeautifulSoup("<p>I wish I was bold.</p>")
  2. soup.p.string.wrap(soup.new_tag("b"))
  3. # <b>I wish I was bold.</b>
  4.  
  5. soup.p.wrap(soup.new_tag("div"))
  6. # <div><p><b>I wish I was bold.</b></p></div>

该方法在 Beautiful Soup 4.0.5 中添加


unwrap()

Tag.unwrap() 方法与 wrap() 方法相反.将移除tag内的所有tag标签,该方法常被用来进行标记的解包:

  1. markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
  2. soup = BeautifulSoup(markup)
  3. a_tag = soup.a
  4.  
  5. a_tag.i.unwrap()
  6. a_tag
  7. # <a href="http://example.com/">I linked to example.com</a>

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

文章来源互联网,尊重作者原创,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890


Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free