我正在编写一些 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
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