Пропадают запятые при парсинге Python

Рейтинг: 1Ответов: 1Опубликовано: 10.08.2023

при парсинге страницы пропадают запятые в валюте. помогите разобраться

import bs4
import pandas as pd


url = "https://ru.investing.com/currencies/gbp-usd-historical-data"
page = requests.get(url).text
soup = bs4.BeautifulSoup(page, 'html.parser')
page = soup.findAll('table', {'data-test': 'historical-data-table'})
historical_data = pd.read_html(str(page), decimal=',')
historical_data = historical_data[0]
historical_data.to_csv('kurs_val.csv')
0   10.08.2023       12748       12720  ...       12709         NaN      +0.24%
1   09.08.2023       12718       12746  ...       12711         NaN      -0.22%
2   08.08.2023       12746       12785  ...       12684         NaN      -0.30%
3   07.08.2023       12784       12753  ...       12713         NaN      +0.28%
4   04.08.2023       12748       12714  ...       12688         NaN      +0.28%
5   03.08.2023       12713       12711  ...       12622         NaN      +0.03%
6   02.08.2023       12709       12777  ...       12680         NaN      -0.53%
7   01.08.2023       12777       12838  ...       12740         NaN      -0.47%
8   31.07.2023       12837       12849  ...       12828         NaN      -0.10%

Ответы

▲ 2Принят

Поправьте ваш код.

  1. Вы используете но не импортируете его, камон, уважайте тех кто читает ваш вопрос, делайте воспроизводимый пример.
  2. Зачем вам BeautifulSoup? pd.read_html() замечательно работает на голом html. По сути вы ничего не парсите из того, что изначально умеет .
  3. У вас сайт нормально грузится, да? Капчи нет? У меня при первой попытке вылезла. В копилку воспроизводимого примера.

А теперь отвечая на вопрос.
Ход мыслей правильный, поставить decimal=',', но т.к. в pandas thousands по деволту тоже запятая, и идёт раньше, запятая у вас отрабатывает тысячи. Меняйте thousands на что угодно, хотя бы на апостроф, и decimal заработает.

import pandas as pd
import requests

url = "https://ru.investing.com/currencies/gbp-usd-historical-data"
r = requests.get(url)

tables = pd.read_html(r.text, decimal=',', thousands="'")
historical_data = tables[1]
print(historical_data)
Вывод:
          Дата    Цена   Откр.   Макс.    Мин.  Объём  Изм. %
0   10.08.2023  1.2729  1.2720  1.2818  1.2709    NaN  +0.09%
1   09.08.2023  1.2718  1.2746  1.2783  1.2711    NaN  -0.22%
2   08.08.2023  1.2746  1.2785  1.2788  1.2684    NaN  -0.30%
3   07.08.2023  1.2784  1.2753  1.2790  1.2713    NaN  +0.28%
4   04.08.2023  1.2748  1.2714  1.2794  1.2688    NaN  +0.28%
5   03.08.2023  1.2713  1.2711  1.2729  1.2622    NaN  +0.03%
6   02.08.2023  1.2709  1.2777  1.2807  1.2680    NaN  -0.53%
7   01.08.2023  1.2777  1.2838  1.2843  1.2740    NaN  -0.47%
8   31.07.2023  1.2837  1.2849  1.2874  1.2828    NaN  -0.10%
9   28.07.2023  1.2850  1.2797  1.2888  1.2763    NaN  +0.45%
10  27.07.2023  1.2793  1.2939  1.2997  1.2781    NaN  -1.13%
11  26.07.2023  1.2939  1.2898  1.2961  1.2875    NaN  +0.30%
12  25.07.2023  1.2900  1.2829  1.2905  1.2809    NaN  +0.53%
13  24.07.2023  1.2832  1.2859  1.2885  1.2797    NaN  -0.18%
14  21.07.2023  1.2855  1.2867  1.2905  1.2816    NaN  -0.08%
15  20.07.2023  1.2865  1.2938  1.2966  1.2839    NaN  -0.56%
16  19.07.2023  1.2937  1.3042  1.3046  1.2868    NaN  -0.74%
17  18.07.2023  1.3034  1.3078  1.3127  1.3028    NaN  -0.28%
18  17.07.2023  1.3071  1.3088  1.3110  1.3051    NaN  -0.11%
19  14.07.2023  1.3086  1.3132  1.3146  1.3087    NaN  -0.36%
20  13.07.2023  1.3133  1.2984  1.3141  1.2981    NaN  +1.13%
21  12.07.2023  1.2986  1.2932  1.3002  1.2903    NaN  +0.42%
22  11.07.2023  1.2932  1.2857  1.2936  1.2854    NaN  +0.57%
23  10.07.2023  1.2859  1.2835  1.2869  1.2750    NaN  +0.18%

UPD

Зачем грузить весь сайт, если можно с api'шки тягать напрямую?
https://api.investing.com/api/financialdata/historical/2?start-date=2022-08-10&end-date=2023-08-10&time-frame=Weekly&add-missing-rows=false