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
相关产品推荐
相关产品推荐

