如何在 BeautifulSoup 中链接 find() 方法并处理 None ?

问题描述 投票:0回答:1

我正在编写一些 HTML 处理并且喜欢 BS4。我确实发现它有点冗长,希望有一些更好的方法来处理这个问题。

我很想像这样将我的发现链接在一起:

soup.find('li', class_='positions').find('span', class_='list-value').getText()

相反,当第一个查找没有找到任何内容时,它会返回

None
,然后下一个查找会按预期失败。

我重写为两行,看起来没问题,但最好有某种

?:
条件运算符,就像我在 c# 中所做的那样。

elem_sup_position = soup.find('li', class_='positions') 
sup_position = elem_sup_position.find('span', class_='list-value').getText() if elem_sup_position is not None else ''

我知道我可能可以将其重写为这样,但我讨厌执行第一个 find 两次以节省 1 行代码!有没有更灵活的方法来做到这一点?我有很多这样的。

sup_position = result.find('li', class_='positions').find('span', class_='list-value').getText() if result.find('li', class_='positions') else None
python web-scraping beautifulsoup
1个回答
0
投票

您可以使用

css selectors
来链接您的选择:

soup.select_one('li.positions span.list-value')

并且您可以使用

walrus operator
(自 Python 3.8 起)来避免将您的选择写入两次:

result.getText() if (result := soup.select_one('li.positions span.list-value')) else None
示例
from bs4 import BeautifulSoup
soup = BeautifulSoup('<li class="positions"><span class="list-value">some text</span></li>')

### your way with find
result.find('span', class_='list-value').getText() if (result := soup.find('li', class_='positions')) else None

### css selectors
result.getText() if (result := soup.select_one('li.positions span.list-value')) else None
© www.soinside.com 2019 - 2024. All rights reserved.