• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python - dziwne zachowanie funkcji

VPS Starter Arubacloud
0 głosów
416 wizyt
pytanie zadane 2 sierpnia 2021 w Python przez Hellmick Początkujący (270 p.)

Witam,

funkcja zwraca None, ale kiedy printuję h, to normalnie wypisuje to, co ma printować.

#######################################
# EKAMEDICA
#######################################


from bs4 import BeautifulSoup as Bs
import xlrd
import urllib3

loc = ("data\\asortyment.xls")

wb = xlrd.open_workbook(loc)
sheet = wb.sheet_by_index(0)

http = urllib3.PoolManager()

#function returns existing products from ekamedica in the excel spreadsheet
def get_products():
    prods = list()
    counter = 0
    for i in range(sheet.nrows):
        if sheet.cell_value(i, 3) != 0:
            if 'ekamedica' in sheet.cell_value(i,2).lower():
                counter += 1
                prods.append([sheet.cell_value(i,2).replace('EkaMedica ',''),sheet.cell_value(i,10),sheet.cell_value(i,13)])
    return prods


#fuction gets html data of the product
#if there are more products than 1 matching the first word, search with one more word
def get_html(product, i):
    p = '+'.join(product[0].split(' ')[0:i])
    print(p)
    url = 'https://ekamedica24.pl/szukaj?q=' + p
    response = http.request("GET", url)
    bs_data = Bs(response.data.decode('utf-8'), "html.parser")
    if len(bs_data.find_all("div", {"class": "product-box"})) == 1:
        h = bs_data.find("div", {"class": "product-box"})
        print(h)#####TUTAJ JEST PROBLEM
        return h
    else:
        if len(product[0].split(' ')) < i:
            return None
        get_html(product,i+1)


def main():
    product = get_products()[0]
    print(get_html(product,0))

if __name__ == '__main__':
    main()

Z góry dzięki za pomoc.

1 odpowiedź

+1 głos
odpowiedź 2 sierpnia 2021 przez mokrowski Mędrzec (155,460 p.)
W 40 linii zwracasz h. Co się jednak dzieje jeśli wejdziesz do 41 else i skończysz na get_html(...) ?

Odpowiedź prosta. Python zawsze zwraca wartość z funkcji. Jeśli nie ma jawnego return, jest to None.
komentarz 3 sierpnia 2021 przez Hellmick Początkujący (270 p.)
No niby tak, ale po tym jak h zostaje wyprintowane, to h powinno też zostać zwrócone. Dlaczego w takim razie nie zwraca mi h tylko None? Nawet jeśli warunek nie zostanie spełniony, to funkcja powinna być wywołana ponownie jako funkcja rekurencyjna.
komentarz 3 sierpnia 2021 przez Hellmick Początkujący (270 p.)
Okej, już wiem. Z jakiegoś powodu Python czasami traktuje <bs4.element.Tag> jako NoneType.
komentarz 3 sierpnia 2021 przez Hellmick Początkujący (270 p.)
Zamiast findall() wystarczyło użyć find_all().

Podobne pytania

0 głosów
2 odpowiedzi 473 wizyt
0 głosów
0 odpowiedzi 381 wizyt
0 głosów
2 odpowiedzi 165 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...