Разница между двумя версиями одного кода
первый вариант:
import requests
from bs4 import BeautifulSoup as BS
def get_html(_):
r = requests.get(_)
return r.text
def get_data(html_code):
soup = BS(html_code, 'lxml')
spans = soup.find('span').text
return spans
def main():
url = 'https://yandex.ru/pogoda/213'
print(get_data(get_html(url)))
if __name__ == '__main__':
main()
второй вариант:
import requests
from bs4 import BeautifulSoup as BS
def get_data(html_code):
soup = BS(html_code, 'lxml')
spans = soup.find('span').text
return spans
def main():
url = 'https://yandex.ru/pogoda/213'
r = requests.get(url)
return r.text # вернули html-код сайта
print(get_data(r.text))
if __name__ == '__main__':
main()
не могу понять почему не работает второй вариант, ведь аргумент для функции get_data аналогичный получается.
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
Вы хотите, чтобы print что-то напечатал уже после того, как вы вернули управление из функции? Так не получится. Надо сначала напечатать, а потом выходить:
print(get_data(r.text)) # сначала напечатали
return r.text # потом вернули html-код сайта
И если вы хотите как-то использовать то, что вернула функция, надо что-то с результатом сделать - присвоить куда-то или напечатать:
if __name__ == '__main__':
print(main()) # печатаем то, что вернула функция
Автор решения: danilshik
→ Ссылка
У вас все в куче, разделите эту кучу на составные части:
def get_html(r):
return BeautifulSoup(r, "lxml")
def request(url, params):
while True:
try:
r = requests.get(url, params=params, headers=header)
if(r.status_code == 200):
return r.text
else:
print("Ожидание 1 секунда")
time.sleep(1)
except Exception as e:
print("Ожидание 1 секунда", e)
time.sleep(1)
def get_data(html):
spans = html.find('span').text
return spans
def parse():
url = ""
r = request(url, None)
html = get_html(r)
spans = get_data(html)
Примерно так, метод request можно менять в зависимости от функционала и требуемой обработки ошибки