如何组合多个 try-except 块?

How to combine multiple try-except blocks?

我有一堆语句想用 try, except on。是的,不好的做法。

一定有更pythonic的写法吧?

try:
    E1=clean_html.find("span",{"class":"range-a"}).text
except AttributeError:
    E1=None

try:
    E2=clean_html.find("span",{"class":"range-b"}).text 
except AttributeError:
    E2=None

try:
    E3=clean_html.find("span",{"class":"range-c"}).text 
except AttributeError:
    E3=None

try:
    E4=clean_html.find("div",{"class":"Description"}).get_text(separator=" ").strip()
except AttributeError:
    E4=None

因为这段代码对我来说工作正常,但看起来效率不高。

您可以为变量分配一个默认值,然后再进行操作。由于您希望默认值是不可变的 None,您可以

E1 = E2 = E3 = E4 = None

try:
    E1=clean_html.find("span",{"class":"range-a"}).text
    E2=clean_html.find("span",{"class":"range-b"}).text 
    E3=clean_html.find("span",{"class":"range-c"}).text 
    E4=clean_html.find("div",{"class":"Description"}).get_text(separator=" ").strip()
except AttributeError:
    pass

处理异常的最佳方法取决于比我们这里更多的上下文,但通常您希望编写更大的块,以便在任何“异常”操作时保持正常状态。

由于异常需要一些处理能力来设置并且可能在视觉上不整洁,因此测试(尤其是当包装在它自己的函数中时)可能是更好的方法。

def get_elem_text(elem, default=None):
    if elem:
        return elem.text
    else:
        return default

E1=get_elem_text(clean_html.find("span",{"class":"range-a"}))
E2=get_elem_text(clean_html.find("span",{"class":"range-b"})) 
E3=get_elem_text(clean_html.find("span",{"class":"range-c"})) 
# I don't know what "get_text" is so can't abstract it
#E4=get_elem_text(clean_html.find("div",{"class":"Description"}), default="")).strip()

您可以编写一个函数来处理 try 和 except。如果您希望函数处理 None 在其上调用方法时抛出错误的问题,您可以将 post_processing 作为 lambda 传递

def get_clean_text(tag, class_name, post_processor):
    try:
        return post_processor(clean_html.find(tag,{"class": class_name}))
    except AttributeError:
        return None

E1 = get_clean_text("span", "range-a", lambda o: o.text)
E4 = get_clean_text("div", "Description", lambda o: o.get_text(separator=" ").strip())