我正在为网络刮刀编写一个课程。该类接受一个BeautifulSoup对象,并尝试查找具有id: kFin
(主要财务)的表。
但是,有两种边缘情况可能:表可能不存在,或者表可以存在1个或多个可提取的值。在尝试获取值时,如果某个值不存在(在每个方法中除了try之外),我可以解决此问题。但是,我目前难以理解的是这个问题:
"我如何避免/阻止/返回" N / A"如果kFin
表从一开始就不存在,以最可能的pythonic /有效方式?"
class KeyFinancials:
def __init__(self, page):
self.page = page
#TODO: Implement try except when grabbing Financials table
table = page.find("table", attrs={'id': 'kFin'})
head = [element.get_text() for element in table.select('th')]
rows = [element.get_text() for element in table.select('td')]
self.data = dict(zip(head, rows))
def annual_sales(self):
try:
return self.data['Annual Sales'].rstrip().lstrip()
except:
return "N/A"
def sales_2015(self):
try:
return self.data['2015 Sales'].rstrip().lstrip()
except:
return "N/A"
def annual_net_income(self):
try:
return self.data['Annual Net Income'].rstrip().lstrip()
except:
return "N/A"
我在课堂上有大约8种类似的方法。如果我试图调用任何类方法,我的return "N/A"
脚本中有main.py
的好方法吗?
如果我在这里没有100%正确地使用术语,我会道歉,我是自学成才的团队,而且刚刚开始理解课程。
非常感谢你。
答案 0 :(得分:1)
如果在尝试创建类的实例时找不到表,然后在调用代码中处理异常,则可以选择抛出异常。在__init__
中,写一下:
class KeyFinancials:
def __init__(self, page):
self.page = page
table = page.find("table", attrs={'id': 'kFin'})
if table is None:
raise ValueError('The table was not found!')
请注意,如果您了解自定义例外情况,则可能需要在此处使用,例如MissingTableError
,而不是ValueError
。如果没有,不用担心。
现在,在您的调用代码中,每当您尝试创建类时都要检查错误:
try:
financials = KeyFinancials(page)
except ValueError:
# oh no, the page didn't have a table!
print "N/A"
现在,您的示例代码不会使用page
,除非立即查找table
。也许最好是在KeyFinancials.__init__
表格中做出唯一的论证?那样你就可以写:
class KeyFinancials:
def __init__(self, table):
self.table = table
# ...
并在您的调用代码中执行错误检查:
table = page.find("table", attrs={'id', 'kFin'})
if table is None:
print "N/A"
else:
financials = KeyFinancials(table)
# ...