其他分享
首页 > 其他分享> > 遍历文档树

遍历文档树

作者:互联网

子节点

1. tag的名字

2. .contents 和 .children

3. .descendants


head_tag.contents

# [<title>The Dormouse's story</title>]

for child in head_tag.descendants:

print(child)

# <title>The Dormouse's story</title>

# The Dormouse's story

上面的例子中, <head>标签只有一个子节点,但是有2个子孙节点:<head>节点和<head>的子节点, BeautifulSoup 有一个直接子节点(<html>节点),却有很多子孙节点:


len(list(soup.children))

# 1

len(list(soup.descendants))

# 25

4. .string


title_tag.string

# u'The Dormouse's story'

如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同:


head_tag.contents

# [<title>The Dormouse's story</title>]

head_tag.string

# u'The Dormouse's story'

如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None :


print(soup.html.string)

# None

5. .strings 和 stripped_strings

父节点

1. .parent

2. .parents

兄弟节点


sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")

print(sibling_soup.prettify())

# <html>

# <body>

# <a>

# <b>

# text1

# </b>

# <c>

# text2

# </c>

# </a>

# </body>

# </html>

因为标签和标签是同一层:他们是同一个元素的子节点,所以可以被称为兄弟节点.一段文档以标准格式输出时,兄弟节点有相同的缩进级别.在代码中也可以使用这种关系.

1. .next_sibling 和 .previous_sibling


<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>

<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>

<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>

如果以为第一个<a>标签的.next_sibling 结果是第二个<a>标签,那就错了,真实结果是第一个<a>标签和第二个<a>标签之间的顿号和换行符:

第二个<a>标签是顿号的 .next_sibling 属性:

2. .next_siblings 和 .previous_siblings

回退和前进


<html><head><title>The Dormouse's story</title></head>

<p class="title"><b>The Dormouse's story</b></p>

HTML解析器把这段字符串转换成一连串的事件: “打开标签”,”打开一个标签”,”打开一个标签”,”添加一段字符串”,”关闭<title>标签”,”打开<p>标签”,等等.Beautiful Soup提供了重现解析器初始化过程的方法.</p>

1. .next_element 和 .previous_element

.next_element 属性指向解析过程中下一个被解析的对象(字符串或tag),结果可能与.next_sibling相同,但通常是不一样的.

这是文档中最后一个<a>标签,它的 .next_sibling 结果是一个字符串,因为当前的解析过程 [2] 因为当前的解析过程因为遇到了<a>标签而中断了:


last_a_tag = soup.find("a", id="link3")

last_a_tag

# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

last_a_tag.next_sibling

# '; and they lived at the bottom of a well.'

但这个<a>标签的.next_element属性结果是在<a>标签被解析之后的解析内容,不是<a>标签后的句子部分,应该是字符串”Tillie”:


last_a_tag.next_element

# u'Tillie'

这是因为在原始文档中,字符串“Tillie” 在分号前出现,解析器先进入<a>标签,然后是字符串“Tillie”,然后关闭</a>标签,然后是分号和剩余部分.分号与<a>标签在同一层级,但是字符串“Tillie”会被先解析.

.previous_element 属性刚好与 .next_element相反,它指向当前被解析的对象的前一个解析对象:

2. .next_elements 和 .previous_elements

标签:遍历,标签,next,sibling,tag,文档,字符串,节点
来源: https://www.cnblogs.com/lalavender/p/10744880.html