Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Ошибка “append() takes no keyword arguments” при парсинге данных с WEB страницы

#python #python_3x #парсер #pandas #dataframe


Написал парсер, но почему то выходит ошибка со словарем.

from lxml.html import fromstring
import requests
from urllib.parse import urljoin
from pandas import DataFrame, ExcelWriter

url = 'http://reestr.nopriz.ru'

def prinz():
    r = requests.get(url).text
    f = fromstring(r)

    df = DataFrame(columns=('Номер в гос. реестре', 'ИНН', 'ОГРН', 'Федеральный округ',
'Адрес местонахождения', 'Фактический адрес', 'Телефон'
    'Email', 'Адрес сайта', 'Руководитель коллегиального органа СРО', 'Руководитель
исполнительного органа СРО', ))

    for value in range(1, 2):
        silk = ('http://reestr.nopriz.ru/?page=%s' % value)

        pr = requests.get(silk).text
        pf = fromstring(pr)
        for dd in pf.cssselect('.col-xs-12 table tr'):
            da = dd.cssselect('tr')[0]
            dhref = da.get('rel')
            dj = urljoin(url, dhref)
            #print(dj)


            dr = requests.get(dj).text
            df = fromstring(dr)

            try:
                nomer = df.cssselect('.col-xs-5 tr td')[1].text_content()
                inn  = df.cssselect('.col-xs-5 tr td')[3].text_content()
                ogrn = df.cssselect('.col-xs-5 tr td')[5].text_content()
                federal = df.cssselect('.col-xs-5 tr td')[7].text_content()
                adress = df.cssselect('.col-xs-5 tr td')[9].text_content()
                factadress = df.cssselect('.col-xs-5 tr td')[11].text_content()
                tel = df.cssselect('.col-xs-5 tr td')[13].text_content()
                email = df.cssselect('.b-table-sro tr td')[15].text_content()
                rykk = df.cssselect('.b-table-sro tr td')[17].text_content()
                rykkisp = df.cssselect('.b-table-sro tr td')[19].text_content()
                obnov = df.cssselect('.b-table-sro tr td')[21].text_content()

            except Exception as e:
                continue

            prizreestr = [('Номер в гос. реестре', nomer), ('ИНН', inn), ('ОГРН',
ogrn), ('Федеральный округ', federal), ('Адрес местонахождения', adress), ('Фактический
адрес', factadress),
                            ('Телефон', tel), ('Email', email), ('Руководитель коллегиального
органа СРО', rykk), ('Руководитель исполнительного органа СРО', rykkisp), ('Обновлено',
obnov)]

            df = df.append(dict(prizreestr), ignore_index=True)
            print(df)

    writer = ExcelWriter('prizr.xlsx', engine='xlsxwriter')
    df.to_excel(writer, sheet_name='1', header=True, index=False)
    writer.save()


Вывод ошибки:

Возникло исключение: TypeError
append() takes no keyword arguments
  File "C:\Users\artdd\github\pythonproject\nopriz.py", line 49, in prinz
    df = df.append(dict(prizreestr), ignore_index=True)
  File "C:\Users\artdd\github\pythonproject\nopriz.py", line 59, in main
    prinz()
  File "C:\Users\artdd\github\pythonproject\nopriz.py", line 62, in 
    main()


В чем причина ошибки?
    


Ответы

Ответ 1



Смотрим внимательно: df = DataFrame(columns=('Номер в гос. реестре', 'ИНН', 'ОГРН', 'Федеральный округ', 'Адрес местонахождения', 'Фактический адрес', 'Телефон' ... ... df = fromstring(dr) ... df = df.append(dict(prizreestr), ignore_index=True) Переменная df в определенный момент времени перестает хранить ссылку на объект типа DataFrame. Вместо df = fromstring(dr) назовите например root = fromstring(dr), ну и, соответственно, root.cssselect А объект, что вернулся из fromstring тоже имел метод append, но не поддерживал keyword-аргументы, а у вас это был ignore_index

Ответ 2



Воспользуйтесь магиями lxml и Pandas: import pandas as pd import requests from lxml.html import fromstring from urllib.parse import urljoin url = 'http://reestr.nopriz.ru' def parse_page(url=url): r = requests.get(url) if not r.ok: r.raise_for_status() tree = fromstring(r.text) urls = [urljoin(url, x.attrib['rel']) for x in tree.cssselect('.col-xs-12 table tbody tr')] dfs = [] for u in urls: dfs.append(pd.concat([d.set_index(0).T for d in pd.read_html(u)], axis=1)) return pd.concat(dfs, ignore_index=True) df = parse_page(url) Результат: In [118]: df Out[118]: 0 Номер в гос. реестре: ... Обновлено: 0 СРО-И-001-28042009 ... 28.11.2018 в 12:36 (UTC +03:00) 1 СРО-И-002-03082009 ... 15.11.2018 в 15:48 (UTC +03:00) 2 СРО-И-003-14092009 ... 04.12.2018 в 17:21 (UTC +03:00) 3 СРО-И-004-29092009 ... 27.11.2018 в 09:57 (UTC +03:00) 4 СРО-И-005-26102009 ... 28.12.2017 в 14:39 (UTC +03:00) 5 СРО-И-006-09112009 ... 29.11.2018 в 16:20 (UTC +03:00) 6 СРО-И-007-30112009 ... 28.11.2018 в 13:06 (UTC +03:00) 7 СРО-И-008-30112009 ... 20.11.2018 в 14:32 (UTC +03:00) 8 СРО-И-009-07122009 ... 03.08.2018 в 11:02 (UTC +03:00) 9 СРО-И-010-11122009 ... 19.11.2018 в 12:40 (UTC +03:00) 10 СРО-И-011-23122009 ... 19.11.2018 в 14:08 (UTC +03:00) 11 СРО-И-012-24122009 ... 03.12.2018 в 18:47 (UTC +03:00) 12 СРО-И-013-25122009 ... 03.12.2018 в 12:27 (UTC +03:00) 13 СРО-И-014-25122009 ... 28.11.2018 в 10:40 (UTC +03:00) 14 СРО-И-015-25122009 ... 12.11.2018 в 10:01 (UTC +03:00) 15 СРО-И-016-28122009 ... 27.11.2018 в 09:38 (UTC +03:00) 16 СРО-И-017-29122009 ... 03.12.2018 в 10:12 (UTC +03:00) 17 СРО-И-018-30122009 ... 04.12.2018 в 18:48 (UTC +03:00) 18 СРО-И-019-11012010 ... 03.12.2018 в 12:12 (UTC +03:00) 19 СРО-И-020-11012010 ... 28.11.2018 в 10:54 (UTC +03:00) [20 rows x 12 columns] In [119]: df.columns Out[119]: Index(['Номер в гос. реестре:', 'ИНН:', 'ОГРН:', 'Федеральный округ:', 'Адрес местонахождения:', 'Фактический адрес:', 'Телефон:', 'Email:', 'Адрес сайта:', 'Руководитель коллегиального органа СРО:', 'Руководитель исполнительного органа СРО:', 'Обновлено:'], dtype='object', name=0) NOTE: приведенная в ответе функция парсит одну страницу. Добавить цикл по страницам не должно составить труда...

Ответ 3



Возможно у вас ошибка в блоке try-except Во всяком случае содержимое страницы и словаря сильно отличается.

Комментариев нет:

Отправить комментарий