Zapisywanie kursów walut poprzez lxml

0

Witam serdecznie

Potrzebuję wydobyć aktualne kursy walut do mojego przelicznika walut (również stworzonego w Pythonie). Kod który napisałem działa, ale dodatkowo dorzuca znaki, z którymi w prosty sposób nie mogę dokonać konwersji.

import requests
import lxml.html

html = requests.get("https://kursy-walut.mybank.pl/")
doc = lxml.html.fromstring(html.content)
USDkurs = doc.xpath('//*[@id="USDPLN_NBP"]/text()')
EURkurs = doc.xpath('//*[@id="EURPLN_NBP"]/text()')
CHFkurs = doc.xpath('//*[@id="CHFPLN_NBP"]/text()')
GBPkurs = doc.xpath('//*[@id="GBPPLN_NBP"]/text()')

Oto wynik po wywołaniu printa
screenshot-20190520004918.png

Czy wiecie może jak się tych nawiasów i apostrofów pozbyć?

Pozdrawiam
Piotr

1

Może spróbuj w taki sposób:

USDkurs = float(doc.xpath('//*[@id="USDPLN_NBP"]/text()')[0].replace(',', '.')) 

0

Super! Działa znakomicie. Mam jeszcze jedno pytanie - wszystko działa prawidłowo w momencie wrzucenia tego małego skryptu do mojego programu w definicję, gdzie odbywa się przeliczanie. Natomiast nie chciałbym robić bałaganu w programie i umieścić ten skrypt w osobnej definicji. Wtedy pojawia się problem, że program nie widzi mojej zmiennej. Jak się odwołać do zmiennej w innej definicji?

screenshot-20190520203713.png

0

Z tego co widać to uzywasz tych funkcji jako metody klasy.(maja paramter self) W takim przypadku możesz w metodzie init stworzyć sobie zmienne self.USDkurs itp i będą one widoczne we wszystkich metodach klasy i wtedy tam gdzie masz USDkurs to bedziesz mial self.USDkurs itp

0

Po dodaniu zmiennych program się wysypuje już na self.USDkurs - czy coś źle dopisałem?

class Kalkulator(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)

        self.interfejs()
        self.USDkurs
        self.EURkurs
        self.CHFkurs
        self.GBPkurs

1

Tak, przypisz jakieś wartości domyślne zmiennym np self.USDkurs = 0

0

Ok, błąd nie wyskakuje, w def Pobieranie_kursow zmieniłem zmienne USDkurs na self.USDkurs, w def przeliczanie również zmieniłem zmienne na self.USDkurs
Wyskakuje jednak komunikat że nie można dzielić przez zero czyli tak jakby nie działa wczytywanie kursów i zostaje przypisana domyślna wartość :/

1

W takim razie upewnij się ze pobieranie kursów jest wykonywane wcześniej przed funkcją przeliczanie

0

No tak :D Przecież to, że dopisałem definicję Pobieranie_kursow przed definicją przeliczanie nie oznaczało, że program wcześniej ją uruchomi ;) W trakcie rozwiązywania tego problemu pojawił się kolejny, a mianowicie musiałem zmienić sposób parsowania danych. I znów mam problem z wyodrębnieniem tylko samej kwoty. Próbowałem funkcji findAll lub find_All jednakże pojawia się puste pole. Natomiast bez wyodrębniania wczytany xml wygląda tak:

screenshot-20190520233034.png

Kod również króciutki:

from bs4 import BeautifulSoup
import urllib.request

url = urllib.request.urlopen('http://api.nbp.pl/api/exchangerates/rates/a/chf/')
url.encoding = 'UTF-8'
xml = BeautifulSoup(url, 'lxml')

print(xml)
0

Żeby tamten problem prawidłowo rozwiązać, musisz dodać na początku linijki self.:

self.USDkurs = float(doc.xpath('//*[@id="USDPLN_NBP"]/text()')[0].replace(',', '.')) 

Inaczej, zmienna będzie zmienną lokalną funkcji i po wyjściu z niej wyjdzie z zakresu (stracisz do niej dostęp).

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