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>]
添加回答
举报