You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中JavaScript可选链object?.method()等价写法及爬取报错解决

解决BeautifulSoup爬取的AttributeError:Python替代JS可选链的方案

爬取页面时部分元素缺失,导致select_one()返回None,调用getText()会触发AttributeError。Python没有直接对应JSobject?.method()的语法,但可以通过以下几种方式实现类似效果:

1. 条件表达式直接判断

针对单个元素,先判断是否存在再调用方法:

"crash": basicSoup.select_one('.basics-effects .basics-crash').getText() if basicSoup.select_one('.basics-effects .basics-crash') else None

缺点是同一个选择器会执行两次,效率稍低。

2. 复用工具函数

写一个通用函数处理所有元素的安全文本获取,减少重复代码:

def safe_get_text(elem, default=None):
    # 可选加上strip=True去除首尾空白
    return elem.getText(strip=True) if elem else default

调用时直接传入选择器结果:

"crash": safe_get_text(basicSoup.select_one('.basics-effects .basics-crash'))

3. 海象运算符简化(Python 3.8+)

用海象运算符:=把选择器结果存到变量,只执行一次选择:

"crash": (elem := basicSoup.select_one('.basics-effects .basics-crash')).getText() if elem else None

修改后的完整代码示例

用工具函数优化后的爬取代码:

def safe_get_text(elem, default=None):
    return elem.getText(strip=True) if elem else default

basicInfo = {
    "details": safe_get_text(basicSoup.select_one('.basics-description  .basics-text')),
    "dose": safe_get_text(basicSoup.select_one('.basics-description .basics-dose')),
    "price": safe_get_text(basicSoup.select_one('.basics-description .basics-price')),
    "chemistry": safe_get_text(basicSoup.select_one('.basics-description .basics-chemistry')),
    "law": safe_get_text(basicSoup.select_one('.basics-description .basics-law')),
    "pharmacology": safe_get_text(basicSoup.select_one('.basics-description .basics-pharmacology')),
    "production": safe_get_text(basicSoup.select_one('.basics-description .basics-production')),
    "history": safe_get_text(basicSoup.select_one('.basics-description .basics-history')),
    "terminology": safe_get_text(basicSoup.select_one('.basics-description .basics-terminology')),
    "effects": {
        "text": safe_get_text(basicSoup.select_one('.basics-effects .basics-text')),
        "onset": safe_get_text(basicSoup.select_one('.basics-effects .basics-onset')),
        "duration": safe_get_text(basicSoup.select_one('.basics-effects .basics-duration')),
        "visuals": safe_get_text(basicSoup.select_one('.basics-effects .basics-visuals')),
        "crash": safe_get_text(basicSoup.select_one('.basics-effects .basics-crash')),
        "hangover": safe_get_text(basicSoup.select_one('.basics-effects .basics-hangover')),
    },
    "problems": {
        "text": safe_get_text(basicSoup.select_one(".basics-problems > .basics-text")),
    }
}

内容的提问来源于stack exchange,提问作者Julian Sanchez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:50:19