Webscraping - 如果 "Nontype" 对象没有属性,则添加 If 语句
Webscraping - Adding a If Statement if a "Nontype" object has no attribute
感谢阅读!对于我的项目,我正在做的是滚动浏览公司年度报告以提取董事会成员和职位的姓名。因为不同的公司有不同的格式我想尝试一种方法来抓取信息,如果这个过程导致 "Nontype" 错误(因为一个方法没有找到属性或关键字),转向不同的方法和试试那个方法。我只需要一种方法来说明是否存在非类型错误,请尝试下一个方法。下面是一种导致错误的方法。
tables_ticker = annual_report_page_soup.find(text="Age").find_parent("table")
resticker = []
for row in tables_ticker.find_all("tr")[1:]:
#print([cell.get_text(strip=True) for cell in row.find_all("td")])
if row:
resticker.append([cell.get_text(strip=True) for cell in row.find_all("td")])
non_empty_ticker = [sublist for sublist in resticker if any(sublist)]
df_ticker = pd.DataFrame.from_records(non_empty_ticker)
df_ticker[df_ticker == ''] = np.nan
df_ticker=df_ticker.dropna(axis=1, how='all')
print(df_ticker)
错误:
回溯(最后一次调用):
文件 "C:/Users/james/PycharmProjects/untitled2/Edgar/WMT Working.py",第 84 行,位于
tables_ticker = annual_report_page_soup.find(文本="Age").find_parent("table")
AttributeError: 'NoneType' 对象没有属性 'find_parent'
这是一个可以应用于您的代码的简单示例:
for item in ["Hello", "World", None, "Foo", None, "Bar"]:
print(item.upper())
输出:
HELLO
WORLD
Traceback (most recent call last):
AttributeError: 'NoneType' object has no attribute 'upper'
>>>
如您所见,一旦 for 循环到达列表中的第三项(不是字符串,它是 NoneType
对象),就会引发异常,因为 NoneType
对象没有 upper
方法。这适用于前两次迭代,因为字符串确实有一个 upper
方法。
解决方案 - 使用 try-except 块:
for item in ["Hello", "World", None, "Foo", None, "Bar"]:
try:
print(item.upper())
except AttributeError:
continue
输出:
HELLO
WORLD
FOO
BAR
>>>
我们用 try-except 块封装了可能引发 AttributeError
的代码行。如果代码行引发这样的异常,我们使用 continue
关键字跳过循环的这次迭代并移动到列表中的下一个项目。
同理,可以封装这一行:
tables_ticker = annual_report_page_soup.find(text="Age").find_parent("table")
使用 try-except 块。但是,您可以切换抓取格式,而不是在循环中使用 continue
。
感谢阅读!对于我的项目,我正在做的是滚动浏览公司年度报告以提取董事会成员和职位的姓名。因为不同的公司有不同的格式我想尝试一种方法来抓取信息,如果这个过程导致 "Nontype" 错误(因为一个方法没有找到属性或关键字),转向不同的方法和试试那个方法。我只需要一种方法来说明是否存在非类型错误,请尝试下一个方法。下面是一种导致错误的方法。
tables_ticker = annual_report_page_soup.find(text="Age").find_parent("table")
resticker = []
for row in tables_ticker.find_all("tr")[1:]:
#print([cell.get_text(strip=True) for cell in row.find_all("td")])
if row:
resticker.append([cell.get_text(strip=True) for cell in row.find_all("td")])
non_empty_ticker = [sublist for sublist in resticker if any(sublist)]
df_ticker = pd.DataFrame.from_records(non_empty_ticker)
df_ticker[df_ticker == ''] = np.nan
df_ticker=df_ticker.dropna(axis=1, how='all')
print(df_ticker)
错误:
回溯(最后一次调用): 文件 "C:/Users/james/PycharmProjects/untitled2/Edgar/WMT Working.py",第 84 行,位于 tables_ticker = annual_report_page_soup.find(文本="Age").find_parent("table") AttributeError: 'NoneType' 对象没有属性 'find_parent'
这是一个可以应用于您的代码的简单示例:
for item in ["Hello", "World", None, "Foo", None, "Bar"]:
print(item.upper())
输出:
HELLO
WORLD
Traceback (most recent call last):
AttributeError: 'NoneType' object has no attribute 'upper'
>>>
如您所见,一旦 for 循环到达列表中的第三项(不是字符串,它是 NoneType
对象),就会引发异常,因为 NoneType
对象没有 upper
方法。这适用于前两次迭代,因为字符串确实有一个 upper
方法。
解决方案 - 使用 try-except 块:
for item in ["Hello", "World", None, "Foo", None, "Bar"]:
try:
print(item.upper())
except AttributeError:
continue
输出:
HELLO
WORLD
FOO
BAR
>>>
我们用 try-except 块封装了可能引发 AttributeError
的代码行。如果代码行引发这样的异常,我们使用 continue
关键字跳过循环的这次迭代并移动到列表中的下一个项目。
同理,可以封装这一行:
tables_ticker = annual_report_page_soup.find(text="Age").find_parent("table")
使用 try-except 块。但是,您可以切换抓取格式,而不是在循环中使用 continue
。