Problem z dekodowaniem pliku .csv pobranego z strony

0

Witam. Uczę sie pythona od jakiegoś czasu. Mam mały problem z dekodowaniem pobranego pliku csv.

Chciałbym pobrać plik z strony https://www.money.pl/gielda/archiwum/spolki/ w formacie csv. Do wysłania zapytania używam biblioteki urllib.request. Wszystkie dane do wysłania w ciele zapytania są wpisane dobrze, w odpowiedzi dostaje plik .csv. Natomiast jak rozumiem jest on zapisany w bajtach. gdy chcę go dekodować robię to tak jak w przypadku zwracanego pliku html, w którym ten sposób działa:

    request = urllib.request.Request("https://www.money.pl/gielda/archiwum/spolki/", data=data, headers=headers)
    response = urllib.request.urlopen(request)
    file = response.read().decode("utf-8")

Natomiast wyświetla mi error: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 12: invalid start byte
Normalnie próbowałem zmienić to na stringa, i za pomocą funkcji strip usunąć znak b', oraz split porozdzielać na poszczególne linie, i wtedy wpisywać wszystko do pliku z znakiem wraz z dodanym znakiem nowej lini na końcu dla każdego wiersza, ale wtedy brak mi polskich znaków.

Mój cały kod wygląd tak:

import urllib.request, urllib.parse

def downoladFile(day_to, format, day_from, symbol,period="0", show="Poka%BF"):

    values = {"do": day_to,
              "format": format,
              "od": day_from,
              "period": period,
              "show": show,
              "symbol": symbol}

    data = urllib.parse.urlencode(values).encode("utf-8")
    headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"}

    request = urllib.request.Request("https://www.money.pl/gielda/archiwum/spolki/", data=data, headers=headers)
    response = urllib.request.urlopen(request)
    file = response.read().decode("utf-8")
    print(file)

downoladFile("2018-03-15","csv", "2018-02-15", "PLX")

Z góry dzięki za pomoc.

1

Zmień kodowanie na "ISO-8859-2"

file = response.read().decode("ISO-8859-2")
0

Wielkie dzięki, działa. Gdzie można znaleźć informacje o tym jaki rodzaj kodowania jest akurat potrzebny. Dlaczego np utf-8 nie działa tutaj tak jak w przypadku html?

0

W tym przypadku znaki są kodowane z wykorzystaniem ISO-8859-2. Możesz to sprawdzić w źródle strony https://www.money.pl/gielda/archiwum/spolki/

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

Gdyby kodowanie było ustawione na "UTF-8" to Twój kod działałby poprawnie. Kodowanie przy dekodowaniu musi pasować do kodowania źródła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1