Webscraping - добавление оператора If, если у объекта "нетип" нет атрибута - PullRequest
0 голосов
/ 25 марта 2020

Спасибо за чтение! Что касается моего проекта, то я делаю прокрутку годовых отчетов компании, чтобы узнать имена членов совета директоров и должности. Поскольку разные компании имеют разные форматы, я хотел бы попробовать метод для очистки информации, и если этот процесс приводит к ошибке «Нетип» (потому что один метод не находит атрибуты или ключевое слово), перейти к другому методу и попробовать это метод. Мне просто нужен способ сказать, если есть нетипичная ошибка, попробуйте следующий метод. Ниже приведен один из методов, который приводит к ошибке.

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)

Ошибка:

Traceback (последний вызов был последним): файл "C: / Users / james / PycharmProjects / untitled2 / Edgar / WMT Working.py ", строка 84, в tables_ticker = year_report_page_soup.find (text =" Age "). Find_parent (" table ") AttributeError: у объекта 'NoneType' нет атрибута 'find_parent'

1 Ответ

1 голос
/ 25 марта 2020

Вот простой пример, который вы можете применить к своему коду:

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-l oop достигнет третьего Элемент в списке (который не является строкой, это объект NoneType), возникает исключение, поскольку у объектов NoneType нет метода upper. Это работало в течение первых двух итераций, потому что у строк есть метод upper.

Решение - используйте блок try-exc:

for item in ["Hello", "World", None, "Foo", None, "Bar"]:
    try:
        print(item.upper())
    except AttributeError:
        continue

Выход:

HELLO
WORLD
FOO
BAR
>>> 

Мы инкапсулировали строку кода, которая может бросить потенциал AttributeError с блоком try-exc. Если в строке кода возникает такое исключение, мы используем ключевое слово continue, чтобы пропустить эту итерацию l oop и перейти к следующему элементу в списке.

Таким же образом вы может инкапсулировать эту строку:

tables_ticker = annual_report_page_soup.find(text="Age").find_parent("table")

С блоком try-exc. Однако вместо использования continue внутри al oop вы можете переключать форматы очистки.

...