Запись (очищенного) списка фреймов данных на один лист Excel

#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)