BeautifulSoup – 修改文档

BeautifulSoup 教程, BeautifulSoup的一个重要方面是搜索解析树,它允许你根据你的要求对Web文档进行修改。我们可以使用标签的属性,如.name、.string或.append()方法对标签的属性进行修改。它允许你在.new_string()和.new_tag()方法的帮助下,向现有的标签添加新的标签和字符串。还有其他方法,如.insert()、.insert_before()或.insert_after(),可以对你的HTML或XML文档进行各种修改。

改变标签名称和属性

一旦你创建了soup,就很容易进行修改,如重命名标签、修改其属性、添加新属性和删除属性。

>>> soup = BeautifulSoup('<b class="bolder">Very Bold</b>')
>>> tag = soup.b

修改和添加新的属性如下 −

>>> tag.name = 'Blockquote'
>>> tag['class'] = 'Bolder'
>>> tag['id'] = 1.1
>>> tag
<Blockquote class="Bolder" id="1.1">Very Bold</Blockquote>

删除属性的情况如下 −

>>> del tag['class']
>>> tag
<Blockquote id="1.1">Very Bold</Blockquote>
>>> del tag['id']
>>> tag
<Blockquote>Very Bold</Blockquote>

修改.string

你可以轻松地修改标签的.string属性 −

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner>/i<</a>'
>>> Bsoup = BeautifulSoup(markup)
>>> tag = Bsoup.a
>>> tag.string = "My Favourite spot."
>>> tag
<a href="https://www.tutorialspoint.com/index.htm">My Favourite spot.</a>

从上面我们可以看到,如果该标签包含任何其他标签,它们和它们的所有内容将被新的数据所取代。

append()

通过使用tag.append()方法向现有的标签添加新的数据/内容。它与Python列表中的append()方法非常相似。

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner</i></a>'
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.a.append(" Really Liked it")
>>> Bsoup
<html><body><a href="https://www.tutorialspoint.com/index.htm">Must for every <i>Learner</i> Really Liked it</a></body></html>
>>> Bsoup.a.contents
['Must for every ', <i>Learner</i>, ' Really Liked it']

NavigableString() 和 .new_tag()

如果你想在文档中添加一个字符串,这可以通过使用append()或NavigableString()构造函数轻松完成 −

>>> soup = BeautifulSoup("<b></b>")
>>> tag = soup.b
>>> tag.append("Start")
>>>
>>> new_string = NavigableString(" Your")
>>> tag.append(new_string)
>>> tag
<b>Start Your</b>
>>> tag.contents
['Start', ' Your']

注意:如果你在访问NavigableString()函数时发现任何名称错误,如下所示−

NameError: name ‘NavigableString’ is not defined

只要从bs4包中导入NavigableString目录即可 −

>>> from bs4 import NavigableString

我们可以解决上述错误。

你可以给你现有的标签添加注释,也可以添加一些其他的NavigableString的子类,只需调用构造函数.

>>> from bs4 import Comment
>>> adding_comment = Comment("Always Learn something Good!")
>>> tag.append(adding_comment)
>>> tag
<b>Start Your<!--Always Learn something Good!--></b>
>>> tag.contents
['Start', ' Your', 'Always Learn something Good!']

添加一个全新的标签(而不是追加到现有的标签)可以使用Beautifulsoup的内置方法BeautifulSoup.new_tag()来完成 −

>>> soup = BeautifulSoup("<b></b>")
>>> Otag = soup.b
>>>
>>> Newtag = soup.new_tag("a", href="https://www.tutorialspoint.com")
>>> Otag.append(Newtag)
>>> Otag
<b><a href="https://www.tutorialspoint.com"></a></b>

只有第一个参数,即标签名称,是必需的。.

insert()

类似于Python列表中的.insert()方法,tag.insert()将插入新的元素,但是,与tag.append()不同,新元素不一定在其父内容的最后。新元素可以被添加在任何位置.

>>> markup = '<a href="https://www.djangoproject.com/community/">Django Official website <i>Huge Community base</i></a>'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>>
>>> tag.insert(1, "Love this framework ")
>>> tag
<a href="https://www.djangoproject.com/community/">Django Official website Love this framework <i>Huge Community base</i></a>
>>> tag.contents
['Django Official website ', 'Love this framework ', <i>Huge Community base</i
>]
>>>

insert_before() 和insert_after()

要在解析树中的某一内容之前插入一些标签或字符串,我们使用insert_before()−

>>> soup = BeautifulSoup("Brave")
>>> tag = soup.new_tag("i")
>>> tag.string = "Be"
>>>
>>> soup.b.string.insert_before(tag)
>>> soup.b
<b><i>Be</i>Brave</b>

同样地,如果要在解析树中的某些东西后面插入一些标签或字符串,可以使用insert_after().

>>> soup.b.i.insert_after(soup.new_string(" Always "))
>>> soup.b
<b><i>Be</i> Always Brave</b>
>>> soup.b.contents
[<i>Be</i>, ' Always ', 'Brave']

clear()

要删除一个标签的内容,请使用tag.clear() −

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical&lr;/i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>> tag
<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>
>>>
>>> tag.clear()
>>> tag
<a href="https://www.tutorialspoint.com/index.htm"></a>

extract()

要从树中移除一个标签或字符串,使用PageElement.extract()。

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i&gr;technical & Non-technical</i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>>
>>> i_tag = soup.i.extract()
>>>
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For Contents</a>
>>>
>>> i_tag
<i>technical & Non-technical</i>
>>>
>>> print(i_tag.parent)
None

decompose()

tag.decompose()将一个标签从树中移除,并删除其所有内容.

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For <i>technical & Non-technical</i> Contents</a>
>>>
>>> soup.i.decompose()
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">For Contents</a>
>>>

Replace_with()

顾名思义,pageElement.replace_with()函数将用树中的新标签或字符串替换旧标签或字符串。 −

>>> markup = '<a href="https://www.tutorialspoint.com/index.htm">Complete Python <i>Material</i></a>'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>>
>>> new_tag = soup.new_tag("Official_site")
>>> new_tag.string = "https://www.python.org/"
>>> a_tag.i.replace_with(new_tag)
<i>Material</i>
>>>
>>> a_tag
<a href="https://www.tutorialspoint.com/index.htm">Complete Python <Official_site>https://www.python.org/</Official_site></a>

在上面的输出中,你已经注意到replace_with()返回被替换的标签或字符串(比如我们案例中的 "Material"),所以你可以检查它或把它加回树的另一部分.

wrap()

pageElement.wrap()将一个元素包围在你指定的标签中,并返回一个新的包装器 −

>>> soup = BeautifulSoup("<p>tutorialspoint.com</p>")
>>> soup.p.string.wrap(soup.new_tag("b"))
<b>tutorialspoint.com</b>
>>>
>>> soup.p.wrap(soup.new_tag("Div"))
<Div><p><b>tutorialspoint.com</b></p></Div>

unwrap()

tag.unwrap()与wrap()相反,它将一个标签与该标签内的任何内容替换.

>>> soup = BeautifulSoup('<a href="https://www.tutorialspoint.com/">I liked <i>tutorialspoint</i></a>')
>>> a_tag = soup.a
>>>
>>> a_tag.i.unwrap()
<i></i>
>>> a_tag
<a href="https://www.tutorialspoint.com/">I liked tutorialspoint</a>

从上面可以看出,与 replace_with() 一样,unwrap() 也返回被替换的标签。

下面是unwrap()的另一个例子,以便更好地理解它 −

>>> soup = BeautifulSoup("<p>I <strong>AM</strong> a <i>text</i>.</p>")
>>> soup.i.unwrap()
<i></i>
>>> soup
<html><body><p>I <strong>AM</strong> a text.</p></body></html>

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程