#python #excel #pandas #web-scraping
#python #excel #pandas #веб-очистка
Вопрос:
Я пытаюсь удалить таблицу HTML из списка веб-страниц (на каждой странице есть только одна таблица).
Вот первая часть моего кода:
for i in range(len(urls)):
r = requests.get(urls[i], header)
data = pd.read_html(r.text,index_col=0, header=0)
appended_list.append(data)
«urls» — это список URL-адресов (каждый из которых имеет одну статическую таблицу)
Этот код работает — я получаю список фреймов данных (appended_list).
Теперь я хочу записать этот список фреймов данных в один лист Excel. Это то, что я пробовал —
writer = pd.ExcelWriter('test_1.xlsx', engine='xlsxwriter')
row = 0
for df in appended_list:
df.to_excel(writer,startrow=row,startcol=0)
row = row len(df.index) 1
writer.save()
Я получаю сообщение об ошибке:
df.to_excel(writer,startrow=row,startcol=0)
AttributeError: 'list' object has no attribute 'to_excel'
Похоже, происходит то, что каждый элемент (фрейм данных) appended_list все еще считывается как список. Как преобразовать каждый из этих элементов списка в фрейм данных, чтобы их можно было записать в файл Excel?
Заранее благодарю вас.
Комментарии:
1. Вы выполняли какую-либо отладку? Я бы рекомендовал прочитать ericlippert.com/2014/03/05/how-to-debug-small-programs .
2. Спасибо @AMC! Раньше я кодировал, я давно забыл руководство «хорошие практики». Шаги, упомянутые в вашем сообщении, очень полезны.
Ответ №1:
Каждый элемент appended_list сам по себе является списком в соответствии с документацией https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.read_html.html Если в каждом из этих списков действительно есть только один фрейм данных, вы можете :
df = pd.concat([l[0] for l in appended_list])
df.to_excel(writer)
Это позволяет избежать зацикливания списка и сохранения каждый раз путем объединения всех фреймов данных в один
Ответ №2:
p.read_html считывает HTML-таблицы в список объектов фрейма данных. Затем вы сохраняете эти списки в списке appended_list.
Если вы уверены, что получаете только один фрейм данных с каждого URL-адреса, вы можете попробовать:
for i in range(len(urls)):
r = requests.get(urls[i], header)
data = pd.read_html(r.text,index_col=0, header=0)
appended_list.append(data[0])
обратите внимание на данные [0] в строке 4
В качестве альтернативы, если возможно, что у вас есть более одного фрейма данных с каждой страницы, вы можете использовать extend вместо append.
for i in range(len(urls)):
r = requests.get(urls[i], header)
data = pd.read_html(r.text,index_col=0, header=0)
appended_list.extend(data)