Navigating the tree - Going down
-
child Tag
前一篇呼叫 Tag 底下的 subTag 是用像 class 的方式 (Tag.subTag),沒完整說明的是這個 subTag 可呼叫到的範圍並不只侷限 children Tag,而是整個 Tag 底下第一個遇到的 Tag.name == subTag。
""" html <b class="boldest" id="bold man"> <u>Extremely bold</u> </b> <p>Just a paragraph</p> """ soup = BeautifulSoup(html, 'html.parser') print(soup.u) # <u>Extremely bold</u> -
find_all()
依循前面的 subTag 找法,find_all 則會找出所有的 Tag (Tag.name == subTag)。
soup.find_all('a') # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] -
.contents
Tag.contents 回傳包含所有 child string 的 list。
print(soup.contents) # [<d class="car"><u>Extremely bold.</u></d>, <p>123</p>] -
.children
Tag.children 回傳包含所有 child Tag object 的 list。
for child in soup.children: print(child.name) # b # p -
.descendants
回傳一個不只包含 Tag 底下一層的 subTag,而是整個 tree 上所有 object。底下的結果之所以會有 None,是因為 NavigableString 也是 child 的包含範圍 ( .contents 跟 .children 也一樣 ),而 NavigableString object 沒有 .name。
for child in soup.descendants: print(child.name) # b # u # None # p # None -
.string
回傳底下唯一一個的 NavigableString 。如果 Tag 只有一個 child 而且還是 NavigableString 則回傳。如果 Tag 只有一個 child 且 child 也只有一個 NavigableString child 也是回傳。如果有兩個以上的 NavigableString 則要呼叫 .strings,.string 會回傳 None。
print(soup.u.string) # Extremely bold print(soup.b.string) # Extremely bold print(soup.string) # None -
.strings & .stripped_strings
strings 會回傳所有 NavigableString。但這種情況下仍會紀錄到一些換行或字串前後的空格,所以可以用 stripped_strings 回傳乾淨的 NavigableString list。(如果整個字串都是空格或換行,則這個 NavigableString 會被無視)
for sstr in soup.strings: print(repr(sstr)) # 'Extremely bold' # 'Just a paragraph'
Navigating the tree - Going Up
-
.parent & .parents
基本上就是往上一層的 Tag (Soup 的 parent 為 None)。
link = soup.a link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> for parent in link.parents: print(parent.name) # p # body # html # [document]
Navigating the tree - Going sideways
-
.next_sibling &.previous_sibling
往前找跟往後找,但是要注意的是他沒那方便幫你找到下一個或上一個的 Tag object,絕大部分都是 NavigableString,例如換行 (\n) 之類的。
tag1 = soup.b tag2 = soup.p print(tag1.next_sibling) # <p>123</p> print(tag2.previous_sibling) # <b class="boldest" id="bold man"><u>Extremely bold</u></b>
參考資料 :
1.Beautiful Soup 4.9.0 documentation
0 意見:
張貼留言