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'>