我对Python还是很陌生,所以我想知道是否有比运行大量连续try/except
块更简洁的选择,如下所示?
try:
project_type = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-type")]').text
except Exception:
project_type = 'Error'
try:
title = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-title")]').text
except Exception:
title = 'Error'
try:
description = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-description")]').text
except Exception:
description = 'Error'
try:
category = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-category")]').text
except Exception:
category = 'Error'
...
正如this thread或this thread,中所建议的,我想我可以创建变量名和查询的列表,然后使用for
循环为每个容器项目构造一个字典,但是真的没有其他替代方法可能更具可读性吗?
答案 0 :(得分:2)
代码混乱的原因是因为您有重复的代码。您要连续四次表达相同的想法(查找值,如果失败则设置默认值),这自然意味着您也必须编写四次相同的支持代码。
循环是修复重复代码的好方法-因此,使用名称列表查找和创建值字典是您的理想解决方案。这样,您便可以一次编写逻辑,然后多次使用。
(另外:您的代码重复导致bug!前两个try-except块将'Error'
的值分配给description
而不是适当的变量。重复的代码会咬人!)
答案 1 :(得分:1)
您可以抽象对find_element_by_xpath
的呼叫;这样可以避免代码重复,并使代码更具可读性:
def _find_element_by_xpath(body, xpath)
try:
return body.find_element_by_xpath(xpath).text
except Exception: # <-- Be specific about the Exception to catch
return 'Error'
def get_a_specific_xpath(element):
return f'./div[contains(@class, "discoverableCard-{element}")]'
然后您的代码变为:
project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...