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