我正在使用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