📜  Beautiful Soup-修改树

📅  最后修改于: 2020-11-09 14:27:34             🧑  作者: Mango


 

BeautifulSoup的重要方面之一是搜索分析树,它使您可以根据需要对Web文档进行更改。我们可以使用标签的属性(例如.name 、.)更改标签的属性。字符串或.append()方法。它允许您借助.new_string()和.new_tag()方法将新标签和字符串添加到现有标签中。还有其他方法,例如.insert(),.insert_before()或.insert_after(),可以对HTML或XML文档进行各种修改。

更改标签名称和属性

创建汤后,就可以轻松进行修改,例如重命名标签,对其属性进行修改,添加新属性和删除属性。

>>> soup = BeautifulSoup('Very Bold')
>>> tag = soup.b

修改和添加新属性如下-

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

删除属性如下-

>>> del tag['class']
>>> tag
Very Bold
>>> del tag['id'] >>> tag
Very Bold

修改中。字符串

您可以轻松修改标签的。字符串属性-

>>> markup = 'Must for every Learner>/i<'
>>> Bsoup = BeautifulSoup(markup)
>>> tag = Bsoup.a
>>> tag.string = "My Favourite spot."
>>> tag
My Favourite spot.

从上方可以看到该标签是否包含任何其他标签,它们及其所有内容将被新数据替换。

附加()

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

>>> markup = 'Must for every Learner'
>>> Bsoup = BeautifulSoup(markup)
>>> Bsoup.a.append(" Really Liked it")
>>> Bsoup
Must for every Learner Really Liked it
>>> Bsoup.a.contents
['Must for every ', Learner, ' Really Liked it']

NavigableString()和.new_tag()

如果您想向文档中添加字符串,可以通过使用append()或NavigableString()构造函数轻松完成:

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

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

NameError:未定义名称“ NavigableString”

只需从bs4包中导入NavigableString目录-

>>> from bs4 import NavigableString

我们可以解决以上错误。

您可以将注释添加到现有标签的注释中,也可以添加NavigableString的其他一些子类,只需调用构造函数即可。

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

可以使用Beautifulsoup内置方法BeautifulSoup.new_tag()添加整个标签(不附加到现有标签上)-

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

仅第一个参数,即标记名称。

插入()

与Python列表上的.insert()方法类似,tag.insert()将插入新元素,但与tag.append()不同,新元素不一定要放在其父级内容的末尾。可以在任何位置添加新元素。

>>> markup = 'Django Official website Huge Community base'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>>
>>> tag.insert(1, "Love this framework ")
>>> tag
Django Official website Love this framework Huge Community base
>>> tag.contents
['Django Official website ', 'Love this framework ', Huge Community base]
>>>

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
BeBrave

类似地,要在解析树中的某些内容之后插入一些标记或字符串,请使用insert_after()。

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

明确()

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

>>> markup = 'For technical & Non-technical&lr;/i> Contents'
>>> soup = BeautifulSoup(markup)
>>> tag = soup.a
>>> tag
For technical & Non-technical Contents
>>>
>>> tag.clear()
>>> tag

提取()

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

>>> markup = 'For  Contents'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>>
>>> i_tag = soup.i.extract()
>>>
>>> a_tag
For Contents
>>>
>>> i_tag
technical & Non-technical
>>>
>>> print(i_tag.parent)
None

分解()

tag.decompose()从树中删除标签并删除其所有内容。

>>> markup = 'For technical & Non-technical Contents'
>>> soup = BeautifulSoup(markup)
>>> a_tag = soup.a
>>> a_tag
For technical & Non-technical Contents
>>>
>>> soup.i.decompose()
>>> a_tag
For Contents
>>>

用。。。来代替()

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

>>> markup = 'Complete Python Material'
>>> 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)
Material
>>>
>>> a_tag
Complete Python https://www.python.org/

在上面的输出中,您已经注意到replace_with()返回被替换的标签或字符串(例如本例中的“ Material”),因此您可以对其进行检查或将其添加回树的另一部分。

包()

pageElement.wrap()在您指定的标记中包含一个元素,并返回一个新的包装器-

>>> soup = BeautifulSoup("

tutorialspoint.com

") >>> soup.p.string.wrap(soup.new_tag("b")) tutorialspoint.com >>> >>> soup.p.wrap(soup.new_tag("Div"))

tutorialspoint.com

解开()

tag.unwrap()与wrap()相反,并用该标签内的任何内容替换该标签。

>>> soup = BeautifulSoup('I liked tutorialspoint')
>>> a_tag = soup.a
>>>
>>> a_tag.i.unwrap()

>>> a_tag
I liked tutorialspoint

从上面,您已经注意到,像replace_with()一样,unwrap()返回被替换的标签。

下面是unwrap()的另一个示例,可以更好地理解它-

>>> soup = BeautifulSoup("

I AM a text.

") >>> soup.i.unwrap() >>> soup

I AM a text.

unwrap()非常适合删除标记。