Проблемы с записью результатов в файл CSV - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь записать вывод в csv-файл. Я пробовал как с пандами, так и csv, но я просто получил пустой csv-файл. Чего мне не хватает?

import requests
from bs4 import BeautifulSoup
import pandas as pd
import csv
r = requests.get('https://superstats.dk/program?aar=2018%2F2019')
bs=BeautifulSoup(r.content, "lxml")

table_div=bs.find(id="content")
rows = table_div.find_all('tr')
for row in rows:
    cols=row.find_all('td')
    cols=[x.text.strip() for x in cols]
    print (cols)

df= pd.DataFrame(cols, columns=['Dag', 'Dato', 'Hold', 'Resultat', 'Tilskuere', 'Dommer'])
df.to_csv('Superliga.csv', index=none, encoding='utf-8')

Я хочу вывод из print (cols) в csv-файл.

1 Ответ

0 голосов
/ 09 июля 2019

Я не знаю, как вы на самом деле работали с библиотекой csv, но, используя ее метод csvwriter.writerow(row_values), вы можете легко записывать данные в файл CSV строка за строкой.

Говоря об использовании pandas, проблема в вашем коде заключалась в следующей строке:

df= pd.DataFrame(cols, columns=['Dag', 'Dato', 'Hold', 'Resultat', 'Tilskuere', 'Dommer'])

Основная причина - использование переменной 'cols'.Предположим, что в данных вашей таблицы с веб-страницы страницы есть n строк.Теперь ваша переменная 'cols' получает данные, связанные со строкой, итеративно, поэтому после nth итерации она будет содержать только данные строки nth .И, скорее всего, строка nth пуста на странице, на которую вы ссылаетесь.Поэтому ваш фрейм данных был пуст, потому что вы инициализировали ваш фрейм данных с пустым списком.Таким образом, было бы лучше, если бы вы добавляли данные переменной 'cols' в список после каждой итерации.Эта новая переменная (пусть это будет 'row_data'), которая теперь имеет коллекцию списков, может затем использоваться для создания фрейма данных pandas.

Чтобы поместить эти слова в код, см. Ниже:

  1. Использование csv библиотеки

    import requests
    from bs4 import BeautifulSoup
    #import pandas as pd
    import csv
    r = requests.get('https://superstats.dk/program?aar=2018%2F2019')
    bs=BeautifulSoup(r.content, "lxml")
    #Create a csv.writer object using the csv file you wish to write in
    writer = csv.writer(open('sample.csv','w'))
    #Use writerow method of the object to write your first row/header contents
    writer.writerow(['Dag', 'Dato', 'Hold', 'Resultat', 'Tilskuere', 'Dommer'])
    
    table_div=bs.find(id="content")
    rows = table_div.find_all('tr')
    for row in rows:
        cols=row.find_all('td')
        cols=[x.text.strip() for x in cols]
        print (cols)
        #Some cols are empty, therefore avoid writing them to the file 
        if len(cols)>0:
          #Append all the incoming data row by row
          writer.writerow(cols)
    
    #df= pd.DataFrame(cols, columns=['Dag', 'Dato', 'Hold', 'Resultat', 'Tilskuere', 'Dommer'])
    #df.to_csv('Superliga.csv', index=none, encoding='utf-8')
    
  2. Использование pandas библиотеки

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    import csv
    r = requests.get('https://superstats.dk/program?aar=2018%2F2019')
    bs=BeautifulSoup(r.content, "lxml")
    
    #Create an empty list, and use it to append data row by row
    row_data = []
    
    table_div=bs.find(id="content")
    rows = table_div.find_all('tr')
    for row in rows:
      cols=row.find_all('td')
      cols=[x.text.strip() for x in cols]
      #Some cols are empty, therefore avoid adding them to the 'row_data'
      if len(cols)>0:
        row_data.append(cols[0:6])
    
    #Create a dataframe in one shot using the 'row_data' variable
    df = pd.DataFrame(row_data, columns=['Dag', 'Dato', 'Hold', 'Resultat', 'Tilskuere', 'Dommer'])    
    print(df)
    df.to_csv('Superliga.csv', index = None, encoding='utf-8') 
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...