Скрипт не может добавить спаршенные данные в список

Рейтинг: 0Ответов: 2Опубликовано: 15.02.2023

Скрипт не может добавить спаршенные данные в список.

Код:

def test(soup):

    trs_0 = soup.findAll('div', class_='rcnt tr_0')

    for i in range(len(trs_0)):
        
        fprc = trs_0[i].find('div', class_='fprc')

        fpr = fprc.find('span', class_='fpr').text
        l_fpr.append(fpr)

if __name__ == "__main__":
    url = 'https://www.forebet.com/ru/prognozi-na-segodnq/prognozi-mnee-bolee'
    r = requests.get(url)
    soup = BeautifulSoup(r.text, "lxml")
    l_fpr = []    
    
    test(soup)

    print(l_fpr)

Вывод:

Traceback (most recent call last):
  File "/home/******/********/FB-Parser/Core.py", line 89, in <module>
    test(soup)
  File "/home/******/********/FB-Parser/Core.py", line 71, in test
    fpr = fprc.find('span', class_='fpr').text
AttributeError: 'NoneType' object has no attribute 'find'

При этом, это работает с другими значениями. К тому же, если вместо добавления в список вывести значения через print(), то это сработает, скрипт выведет значения и NoneType не будет:

trs_0 = soup.findAll('div', class_='rcnt tr_0')

for i in range(len(trs_0)):
        
    fprc = trs_0[i].find('div', class_='fprc')

    fpr = fprc.find('span', class_='fpr').text
    print(fpr)

Вывод:

83
99
59
92
и т.д.

Помогите! Сколько в поисках не маялся - так ничего и не нашел...

Ответы

▲ 0

Я так и не понял в чем конкретно заключалась проблема, но судя по всему в сайте.

Для решения придал тип str для класса, чтобы не придавать метод .text вызывающий ошибку и через цикл перебрал каждый символ, зацепив нужные:

fprc = str(trs_1[i].find('div', class_='fprc'))
        
for a in range(len(fprc) - 1):
    if (fprc[a] == 'r' and fprc[a + 1] == '"' and fprc[a + 2] == '>'):
    fpr = fprc[a + 3:a + 5]
    l_fpr.append(fpr)

Но вообще, если блоки в исходном коде ничем не отличаются, можно цеплять через start:stop

▲ 0

Ваша проблема в том, что иногда переменная fpr не содержит значение. Вам просто необходимо обработать это исключение в блоке try, except следующим образом:

from bs4 import BeautifulSoup
import requests


def test(soup):

    trs_0 = soup.findAll('div', class_='rcnt tr_0')

    for i in range(len(trs_0)):
        
        fprc = trs_0[i].find('div', class_='fprc')
        try:
            fpr = fprc.find('span', class_='fpr').text
            l_fpr.append(fpr)
        except AttributeError:
            pass

if __name__ == "__main__":
    url = 'https://www.forebet.com/ru/prognozi-na-segodnq/prognozi-mnee-bolee'
    r = requests.get(url)
    soup = BeautifulSoup(r.text, "lxml")
    l_fpr = []    
    
    test(soup)

    print(l_fpr)

Вывод:

['62', '55', '65', '57', '66', '67', '60', '52', '60', '70', '62', '68', '51', '57', '58', '51', '66', '60', '62', '62', '75', '69', '67', '54', '63', '53', '56', '57', '77', '56', '50', '52', '71', '70', '77', '56', '55', '56', '54', '60', '54', '65', '59', '67', '73', '60', '76', '53', '58', '54', '55', '57', '72', '53', '63', '64', '71', '52', '65', '65']