Beautiful Soup的四种对象

本文深入探讨了BeautifulSoup库在解析HTML和XML文档时,对Tag、NavigableString和Comment的处理。通过示例展示了如何获取Tag的name和attributes,以及如何修改这些属性。同时,解释了多值属性的概念,并讨论了NavigableString对象的特点,包括其不可编辑性以及如何替换字符串内容。最后,介绍了Comment对象及其在文档中的表现。通过对这些基础知识的理解,读者能够更好地掌握BeautifulSoup进行网页解析的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Tag

  • name
    每个Tag都有自己的名字,我们可以通过.name属性来获取:
soup = BeautifulSoup("<b class='boldest'>Extremely bold</b>",'lxml')
tag = soup.b
print(tag.name)

# b

如果改变tag的name,将影响当前通过Beautiful Soup对象所生成的HTML文档。

soup = BeautifulSoup("<b class='boldest'>Extremely bold</b>",'lxml')
tag = soup.b
tag.name = "blockquote"
print(tag)

# <blockquote class="boldest">Extremely bold</blockquote>
  • attributes
    一个tag可能有多个属性。但在<b class='boldest'>Extremely bold</b>只有class一个属性。tag属性的操作方法和字典相同。
soup = BeautifulSoup("<b class='boldest'>Extremely bold</b>",'lxml')
tag = soup.b
print(tag['class'])

# ['boldest']

也可通过.attrs直接获取一个标签的所有属性。

print(tag.attrs)
# {'class': ['boldest']}

tag的属性同字典一样,可以增加,删除和修改。

tag['class'] = 'verybold'
tag['id'] = 'demo'
print(tag.attrs)

# {'class': 'verybold', 'id': 'demo'}

del tag['id'],tag['class']
print(tag.attrs)
#{}
  • 多值属性
    在Beautiful Soup中多值属性的返回类型是list。
css_soup = BeautifulSoup('<p class="body strikeout"></p>','lxml')
print(css_soup.p['class'])

#['body', 'strikeout']

至于它为什么会返回两个值,主要和解析器有关,在lxml的解析下,就把body strikeout认为是多值属性,于是返回两个值。

如果使用xml解析器,那么tag中不包含多值属性:

css_soup = BeautifulSoup('<p class="body strikeout"></p>','xml')
print(css_soup.p['class'])

# body strikeout

不过,也不是所有类似于body strikeout这种形式的属性值都被认为是多值属性。如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回。

css_soup = BeautifulSoup('<p id="my id"></p>','lxml')
print(css_soup.p['id'])

# my id

将tag转换为字符串时,多个属性值会合并为一个值:

css_soup = BeautifulSoup('<p class="body"> </p>','lxml')
css_soup.p['class'] = ['body','strikeout']
print(css_soup.p)

# <p class="body strikeout"> </p>

2. NavigableString

Beautiful Soup用NavigableString类来包装tag中的字符串。

soup = BeautifulSoup('<p class="body strikeout">Extremely bold</p>', 'lxml')
print(soup.string)
print(type(soup.string))

# Extremely bold
# <class 'bs4.element.NavigableString'>

tag中的字符串不能编辑,但可以被替换成其他字符串,使用 replace_with() 方法。

soup = BeautifulSoup('<p class="body strikeout">Extremely bold</p>', 'lxml')
tag = soup.p
tag.string.replace_with("No longer cold")
print(tag)

replace_with()

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup,'lxml')
a_tag = soup.a  #指的是a标签
new_tag = soup.new_tag('b')	#创建一个新的标签
new_tag.string = 'example.net'
a_tag.i.replace_with(new_tag) #标签和本标签包含的内容一起改变
print(a_tag)

#<a href="http://example.com/">I linked to <b>example.net</b></a>

3. Beautiful Soup

BeautifulSoup 对象表示的是一个文档的全部内容。因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性。但它包含了一个值为 “[document]" 的特殊属性。

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup,'lxml')
print(soup.name)

#[document]

4. Comment

comment对象是一个特殊类型的NavigableString对象。

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup,'lxml')
comment = soup.b.string #python能检测到注释中的内容
print(comment)
print(type(comment))

#Hey, buddy. Want to buy a used parser?
#<class 'bs4.element.Comment'>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳叶lhy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值