Возврат нескольких значений с помощью функции - PullRequest
0 голосов
/ 31 октября 2019

Когда я печатаю, я получаю 4 кода и 4 даты, но когда я использую возврат, я получаю только первый.

Это веб-проект с bs4 и запросами. Я очищаю сайт с регулярным выражением. Я использовал метод container = soup.find.all (class) для поиска блоков кода с данными, которые я хочу извлечь.

def get_codes(containers, pattern):
    for container in containers:
        tweet_bodies = str(container.find('p'))
        shift_codes = re.findall(pattern, tweet_bodies)
        for shift_code in shift_codes:
            str(shift_code)
            return (shift_code)`

def get_date(containers):
    for container in containers:
        tweet_dates = container.find_all('a', class_='tweet-timestamp js-permalink js-nav js-tooltip')
        for date in tweet_dates:
            if 'title' in date.attrs:
                return (date['title'])`

Ожидается:

W9KBJ-95X9T-ZC3KW-BJTJT-5FF3T
CZWJJ-X6XHJ-9CJC5-JTT3J-WZ6WC
KZK3T-K6RSJ-ZWTCK-JTJ3T-T3HJJ
CHCBT-TF6HB-ZC3WC-BT333-KBR3B
13:14 - 28. Okt. 2019
14:30 - 27. Okt. 2019
11:33 - 26. Okt. 2019
15:54 - 25. Okt. 2019`

, но яполучите только одну дату и один код.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019
 if 'title' in date.attrs:
                return (date['title'])

Ваш возврат находится внутри оператора if. Это означает, что ваша функция может возвращать даты, но иногда может возвращать None.

Вам необходимо проверить, почему оператор if равен False.

Кроме того, убедитесь, что ваша функция всегда явно возвращает то, что выимел ввиду.

0 голосов
/ 31 октября 2019

return приводит к немедленному завершению текущей функции *, поэтому ваши циклы for достигнут только первой итерации. Если вы хотите выполнить итерацию до конца, вы можете накапливать свои значения в списке и возвращать этот список в конце:

def get_codes(containers, pattern):
    results = []
    for container in containers:
        tweet_bodies = str(container.find('p'))
        shift_codes = re.findall(pattern, tweet_bodies)
        for shift_code in shift_codes:
            results.append(str(shift_code))
    return results

... Или превратить вашу функцию в генератор, заменяя каждыйreturn с yield.

def get_codes(containers, pattern):
    for container in containers:
        tweet_bodies = str(container.find('p'))
        shift_codes = re.findall(pattern, tweet_bodies)
        for shift_code in shift_codes:
            yield str(shift_code)

(* если вы не находитесь внутри блока with или try с блоком finally, и в этом случае перед завершением может произойти некоторая очистка)

...