如何在Python中进行优雅的错误处理

  • 本文关键字:错误 处理 Python python
  • 更新时间 :
  • 英文 :


我正在使用Selenium抓取Linkedin。这是一项非常脆弱的任务,经常会出现异常。我想找到一种优雅的方法来处理错误。互联网有通常的尝试,但它笨拙。。。请参阅以下代码:

try:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(job))
job_title = job.find_element(By.CLASS_NAME, "base-search-card__title").text
company = job.find_element(By.CLASS_NAME, "base-search-card__subtitle").text
location = job.find_element(By.CLASS_NAME, "job-search-card__location").text
except :
print("Boom Boom")

如果任何一个find_element方法抛出,则运行expect部分,并且try中的代码不会进一步执行。我想要一个场景,如果一个失败,except就不会被命中,也就是说,如果失败,我可以返回一个空字符串。我可以把所有的东西都包装在一个函数中,然后做这样的事情:

def extract_job_title(job):
try:
return job.find_element(By.CLASS_NAME, "base-search-card__title").text
except:
return ""

并具有:

job_title = extract_job_title(job)

但这也很笨拙。。。我想要像斯威夫特那样的东西。类似这样的东西:

let job_title = try? job.find_element(By.CLASS_NAME, "base-search-card__title").text ?? ""

类似斯威夫特的东西存在吗?如果不存在,其他人能看到一种制造东西的方法吗;"更好";除了使用函数之外?

通常,如果您有很多非常重复的代码,只有很小的差异,那么您可能可以将其提取到函数或循环中。例如:

searches = {'title': 'base-search-card__title', ...}
data = {}
for item, cls in searches.items():
try:
data[item] = job.find_element(By.CLASS_NAME, cls).text
except:
pass

这也将把数据提取到一个dict中,这似乎比一堆单独的变量更合乎逻辑。

或者,提取到一个函数中:

def get(job, cls):
try:
return job.find_element(By.CLASS_NAME, cls).text
except:
return None
job_title = get(job, 'base-search-card__title')

请注意,您应该在except中拦截特定于异常,而不是任何和所有的异常。

或者,将整个事情颠倒过来,只评估实际存在的元素,并将它们分类到正确的箱子中。大致如下:

classes = {'base-search-card__title': 'title', ...}
data = {}
for elem in job.some_broader_find_query():
data[classes[elem.class_name]] = elem.text

最新更新