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

Python - dziwne zachowanie funkcji

0 głosów
779 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 (158,940 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 774 wizyt
0 głosów
0 odpowiedzi 575 wizyt
0 głosów
2 odpowiedzi 294 wizyt

93,604 zapytań

142,529 odpowiedzi

322,997 komentarzy

63,092 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

Kursy INF.02 i INF.03
...