从一系列页面中收集可选元素及其属性

让我们考虑的情况,当你分析的网页数和要收集元素值是可选的 (可以呈现在一个页面上,并可以在另一个不存在)的 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()