2021年4月7日 星期三

Python - BeautifulSoup 基本應用 (2)

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 意見:

張貼留言

Popular Posts