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

Python - dziwne zachowanie funkcji

Object Storage Arubacloud
0 głosów
465 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 480 wizyt
0 głosów
0 odpowiedzi 384 wizyt
0 głosów
2 odpowiedzi 168 wizyt

92,565 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...