#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, inmain() В чем причина ошибки?
Ответы
Ответ 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 Во всяком случае содержимое страницы и словаря сильно отличается.
Комментариев нет:
Отправить комментарий