读BeautifulSoup官方文档之html树的修改

修改html树无非是对其中标签的改动, 改动标签的名字(也就是类型), 属性和标签里的内容... 先讲这边提供了很方便的方法来对其进行改动...

 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>

然后是改动内容 :

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>

当然你还可以用append(), 我让我奇怪的是使用append()之后的效果看上去是一样的, 但是调用.contents却会发现其实append()是在.contents代表的那个list中append. 另一方面, 你还可以用一个 NavigableString替代String, 也是一样的.

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

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

当然你还可以用append()在tag内部添加注释 :

from bs4 import Comment
new_comment = Comment("Nice to see you.")
tag.append(new_comment)
tag
# <b>Hello there<!--Nice to see you.--></b>
tag.contents
# [u‘Hello‘, u‘ there‘, u‘Nice to see you.‘]

你甚至可以直接创建一个新的tag, 对于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>

除了append()还有insert(), 它的插入, 从原理上来看也是插入了.contents 返回的那个list.

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还有insert_before()和insert_after(), 就是插在当前调用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>

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()很简单, 就是把所调用标签的内容全部清除.

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>

比clear()更神奇的是另外一个extract(),  extract()能够讲所调用的tag从html树中抽出, 同时返回提取的tag, 此时原来html树的该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

decompose()和extract()的区别就在于它完全毁掉所调用标签, 而不返回(这里要注意remove()是毁掉所调用标签的内容...).

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()能够将其调用标签调换成参数标签, 同时返回调用标签...(相当于比extract()多了一个insert()的步骤)

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>

还有wrap()和unwrap(), 好像是用参数标签包住调用标签, 而unwrap()则用调用标签的内容替代调用标签本身.

 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>
 7
 8 markup = ‘<a href="http://example.com/">I linked to <i>example.com</i></a>‘
 9 soup = BeautifulSoup(markup)
10 a_tag = soup.a
11
12 a_tag.i.unwrap()
13 a_tag
14 # <a href="http://example.com/">I linked to example.com</a>
时间: 2024-11-03 22:46:03

读BeautifulSoup官方文档之html树的修改的相关文章

读BeautifulSoup官方文档之html树的打印

prettify()能返回一个格式良好的html的Unicode字符串 : markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>' soup = BeautifulSoup(markup) soup.prettify() # '<html>\n <head>\n </head>\n <body>\

读BeautifulSoup官方文档之html树的搜索(1)

之前介绍了有关的四个对象以及他们的属性, 但是一般情况下要在杂乱的html中提取我们所需的tag(tag中包含的信息)是比较复杂的, 现在我们可以来看看到底有些什么搜索的方法. 最主要的两个方法当然是find_all()和find(), 两者大致思路相同, 只不过一个前者返回符合条件的所有tags, 后者只返回一个tag. 我们先仔细看看find_all. Signature: find_all(name, attrs, recursive, string, limit, **kwargs) f

读BeautifulSoup官方文档之html树的搜索(2)

除了find()和find_all(), 这里还提供了许多类似的方法我就细讲了, 参数和用法都差不多, 最后四个是next, previous是以.next/previous_element()来说的... Signature: find_parents(name, attrs, string, limit, **kwargs) Signature: find_parent(name, attrs, string, **kwargs) Signature: find_next_siblings(

读vue-cli3 官方文档的一些学习记录

原来一直以为[email protected] 就是创建模板的工具,读了官方文档才知道原来这么有用,不少配置让我长见识了 Prefetch 懒加载配置 懒加载相信大家都是知道的,使用Import() 语法就可以在需要的时候加载了,但是读了官方文档Prefetch一节后,发现事情并没有想象的那么简单. 文档写的很清楚,Prefetch是在空闲的时候就加载一些不着急的文件,并且import默认是加上了Prefetch的,也就是说你使用了import可能并不是你想要的结果(比如用户点击某个按钮才触发加

Beautifulsoup官方文档

Beautiful Soup 中文文档 原文 by Leonard Richardson ([email protected]) 翻译 by Richie Yan ([email protected]) ###如果有些翻译的不准确或者难以理解,直接看例子吧.### 英文原文点这里 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作

第0001题 : 产生随机数(顺便读random模块官方文档)

看这个之前我准备先看一下random模块的官方文档... 在整个随机模块中,  最基础的就是random, 它产生一个 [0.0, 1.0)的浮点数. 这个模块下所有的函数实际上是绑定在一个叫做random.Ramdom的类的隐藏实例下的, 当然你可以自己实例化这个类从而得到新的随机数生成器, 同时random模块下还有一个叫做SystemRandom的类, 它使用系统函数 os.urandom()用操作系统提供的随机资源来来产生随机数.(不知所云...) 只挑了一部分看起来有用的函数... r

Mysql优化(出自官方文档) - 第八篇(索引优化系列)

目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexes 3 Column Indexes && Multiple-Column Indexes 4 Comparison of B-Tree and Hash Indexes 5 Use of Index Extensions 6 Invisible Indexes 7 Descending In

由浅入深Zookeeper详解(参考官方文档)

[老哥我最近接到个任务研究一下Zookeeper,对于我这个Linux运维领域的小菜鸟来说也是刚刚听到这个名字,为了养成良好的文档整理和学习能力,我人生第一次开通了博客并把这次的研究经历记录了下来,以后我会不定期的记录下来我对技术领域的探索,希望热爱Linux运维志同道合的兄弟们多指教,一同进步成长.(ps:我本人平时比较沉默,善于观察思考,对历史人物颇有见解,但是一旦说起话来就会滔滔不绝,谁让我曾经的梦想是当一名教师呢!哈哈!)同时,送给大家一句话,人生是一场马拉松比赛,只有坚持到最后的人,才

【苦读官方文档】2.Android应用程序基本原理概述

官方文档原文地址 应用程序原理 Android应用程序是通过Java编程语言来写.Android软件开发工具把你的代码和其它数据.资源文件一起编译.打包成一个APK文件,这个文档以.apk为后缀,保存了一个Android应用程序全部的内容.Android设备通过它来安装相应的应用. 一旦安装到设备上.每一个Android应用程序就执行在各自独立的安全沙盒中: Android系统是一个多用户的Linux系统.每一个应用都是一个用户. Android系统默认会给每一个应用分配一个唯一的用户ID(这个