我正在写一些HTML处理并且喜欢BS 4. 我确实觉得这有点冗长,希望有更好的方法来处理这个问题.

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

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 ''

我知道我可能可以将它重写成这样,但我讨厌执行第一个查找两次来保存1行代码! 有没有更巧妙的方法来做到这一点? 我有很多这样的.

sup_position = result.find('li', class_='positions').find('span', class_='list-value').getText() if result.find('li', class_='positions') else None

推荐答案

您可以使用css selectors来链接您的 Select :

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

并且您可以使用walrus operator(自Python 3.8以来)来避免将 Select 写入两次:

result.getText() if (result := soup.select_one('li.positions span.list-value')) else None
Example
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

Python相关问答推荐

在Windows上启动新Python项目的正确步骤顺序

使用GEKKO在简单DTE系统中进行一致初始化

无法使用equals_html从网址获取全文

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

需要计算60,000个坐标之间的距离

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

NumPy中条件嵌套for循环的向量化

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

调用decorator返回原始函数的输出

UNIQUE约束失败:customuser. username

让函数调用方程

如何更改groupby作用域以找到满足掩码条件的第一个值?

从旋转的DF查询非NaN值

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

比Pandas 更好的 Select

Pandas—堆栈多索引头,但不包括第一列

为什么dict. items()可以快速查找?

极点替换值大于组内另一个极点数据帧的最大值

Polars表达式无法访问中间列创建表达式

时长超过24小时如何从Excel导入时长数据