從一系列頁面中收集可選元素及其屬性

讓我們考慮的情況,當你分析的網頁數和要收集元素值是可選的 (可以呈現在一個頁面上,並可以在另一個不存在)的 paticular 頁面。

此外,元素本身例如是頁面上最普通的元素,換句話說,沒有特定屬性可以唯一地定位它。但是你看到你可以正確地選擇它的父元素,並且你知道在相應的巢狀級別中想要元素的訂單號

from bs4 import BeautifulSoup

soup = BeautifulSoup(SomePage, 'lxml')
html = soup.find('div', class_='base class') # Below it refers to html_1 and html_2

想要的元素是可選的,因此 html 可能有兩種情況:

html_1 = '''
<div class="base class">    # №0
  <div>Sample text 1</div>  # №1
  <div>Sample text 2</div>  # №2  
  <div>!Needed text!</div>  # №3
</div>

<div>Confusing div text</div>  # №4
'''
        
html_2 = '''
<div class="base class">    # №0
  <div>Sample text 1</div>  # №1
  <div>Sample text 2</div>  # №2  
</div>

<div>Confusing div text</div>  # №4
'''

如果你有 html_1 你可以用標籤№3 收集 !Needed text!

wanted tag = html_1.div.find_next_sibling().find_next_sibling() # this gives you whole tag №3

它最初得到№1div,然後 2 次切換到相同的巢狀級別的下一個 div 到達№3。

wanted_text = wanted_tag.text # extracting !Needed text!

當你得到 html_2 時這種方法的有用性 - 方法不會給你錯誤,它會給 None

print(html_2.div.find_next_sibling().find_next_sibling())
None

在這裡使用 find_next_sibling() 是至關重要的,因為它通過相應的巢狀級別限制元素搜尋。如果你使用 find_next() 那麼標籤№4 將被收集,你不需要它:

print(html_2.div.find_next().find_next())
<div>Confusing div text</div>

你還可以探索與對面相反的 find_previous_sibling()find_previous()

所有描述的函式都有其多種變體來捕獲所有標記,而不僅僅是第一個:

find_next_siblings()
find_previous_siblings()
find_all_next()
find_all_previous()