2 回答

TA貢獻2041條經驗 獲得超4個贊
您可以通過以下方法使用 CSS 選擇器.select():
txt = '''<div class="alpha">1</div>
<div class="alpha">2</div>
<div class="alpha">3</div>
<div class="alpha betha">4</div>
<div class="betha alpha">5</div>
<div class="alpha betha gama">6</div>
<div class="alpha gama">7</div>
<div class="alpha">8</div>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(txt, 'html.parser')
only_alpha = soup.select('[class="alpha"]')
only_alpha_betha = soup.select('.alpha.betha:not(.gama)')
print('Only alpha:', only_alpha)
print('Only alpha and betha:', only_alpha_betha)
印刷:
Only alpha: [<div class="alpha">1</div>, <div class="alpha">2</div>, <div class="alpha">3</div>, <div class="alpha">8</div>]
Only alpha and betha: [<div class="alpha betha">4</div>, <div class="betha alpha">5</div>]

TA貢獻1829條經驗 獲得超9個贊
為什么不創建一個輔助函數?
bs4 允許您在使用find_all()a function as filter搜索樹時指定。
從文檔:
如果其他匹配項都不適合您,請定義一個將元素作為唯一參數的函數。True 如果參數匹配,則函數應返回,False否則返回。
問題是我們不能傳遞任何其他參數(在這種情況下是有效類的列表)。我們可以通過使用包裝函數來動態創建過濾器來克服這個問題。
def create_filter(tag_name, class_list):
def class_filter(tag):
return (
tag.name == tag_name and
set(tag.get('class', [])) == set(class_list)
)
return class_filter
讓我們看看這在 @AndrejKesely 的示例 html 上是如何工作的。
僅有的alpha
print(soup.find_all(create_filter('div', ['alpha'])))
輸出
[<div class="alpha">1</div>, <div class="alpha">2</div>, <div class="alpha">3</div>, <div class="alpha">8</div>]
只有alpha和betha
print(soup.find_all(create_filter('div', ['alpha', 'betha'])))
輸出
[<div class="alpha betha">4</div>, <div class="betha alpha">5</div>]
添加回答
舉報