遍歷文檔樹
直接子節(jié)點(diǎn)
要點(diǎn):.contents .children 屬性
.contents
tag 的 .content 屬性可以將tag的子節(jié)點(diǎn)以列表的方式輸出
#["<meta charset='utf-8'/>","<title>The Dormouse's story</title>"]
輸出方式為列表,我們可以用列表索引來獲取它的某一個(gè)元素
print(soup.head.contents[0])
#<meta charset="utf-8"/>
.children
它返回的不是一個(gè) list,不過我們可以通過遍歷獲取所有子節(jié)點(diǎn)。
我們打印輸出 .children 看一下,可以發(fā)現(xiàn)它是一個(gè) list 生成器對(duì)象
print(soup.head.children)
#<list_iterator object at 0x105c1cf28>
獲取里面的內(nèi)容
for child in soup.body.children:
print(child)
所有子孫節(jié)點(diǎn)
知識(shí)點(diǎn):.descendants 屬性
.descendants
.contents 和 .children 屬性僅包含tag的直接子節(jié)點(diǎn),.descendants 屬性可以對(duì)所有tag的子孫節(jié)點(diǎn)進(jìn)行遞歸循環(huán),和 children類似,我們也需要遍歷獲取其中的內(nèi)容。
節(jié)點(diǎn)內(nèi)容
知識(shí)點(diǎn):.string 屬性
多個(gè)內(nèi)容
知識(shí)點(diǎn): .strings .stripped_strings 屬性
.strings
獲取多個(gè)內(nèi)容,不過需要遍歷獲取,比如下面的例子
.stripped_strings
輸出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白內(nèi)容
父節(jié)點(diǎn)
知識(shí)點(diǎn): .parent 屬性
全部父節(jié)點(diǎn)
知識(shí)點(diǎn):.parents 屬性
通過元素的 .parents 屬性可以遞歸得到元素的所有父輩節(jié)點(diǎn),例如
content = soup.head.title.string
for parent in content.parents:
print parent.name
兄弟節(jié)點(diǎn)
知識(shí)點(diǎn):.next_sibling .previous_sibling 屬性
兄弟節(jié)點(diǎn)可以理解為和本節(jié)點(diǎn)處在統(tǒng)一級(jí)的節(jié)點(diǎn),.next_sibling 屬性獲取了該節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn),.previous_sibling 則與之相反,如果節(jié)點(diǎn)不存在,則返回 None
注意:實(shí)際文檔中的tag的 .next_sibling 和 .previous_sibling 屬性通常是字符串或空白,因?yàn)榭瞻谆蛘邠Q行也可以被視作一個(gè)節(jié)點(diǎn),所以得到的結(jié)果可能是空白或者換行
全部兄弟節(jié)點(diǎn)
知識(shí)點(diǎn):.next_siblings .previous_siblings 屬性
通過 .next_siblings 和 .previous_siblings 屬性可以對(duì)當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)迭代輸出
for sibling in soup.a.next_siblings:
print(repr(sibling))
前后節(jié)點(diǎn)
知識(shí)點(diǎn):.next_element .previous_element 屬性