Как получить все строки таблицы, а не только первую строку? - PullRequest
0 голосов
/ 13 марта 2020

Добрый день, сообщество! Мне нужна помощь в написании парсера, я только начинаю программировать на Python 3, может быть, я что-то упустил. Задача такова: на сайте есть таблица с футбольными командами, используя Requests и BeautifulSoup. Мне удалось получить исходный код этой таблицы в переменную firsttable, команда print обычно отображает все нужные мне данные, но когда я пытаюсь отобразить его в виде списка:

10:00 Team 1 Team 2
11:00 Team 3 Team 4
12:00 Team 5 Team 6

И так далее, я могу получить только первое значение из списка, я пытался использовать Пока l oop (например, Пока я < 10), он повторяет мне первое значение из таблицы 10 раз, но не анализирует остальные. Что я делаю не так?

def get_data(html):
    soup = BeautifulSoup(html, 'lxml')
    firsttable = soup.findAll('table', class_='predictionsTable')[0]
    print(firsttable) #Here, all the data that I need is displayed in the console as html source

    for scrap in firsttable:

        try:
            hometeam = scrap.find('td', class_='COL-3').text
        except:
            hometeam = 'Hometeam Error'

        try:
            awayteam = scrap.find('td', class_='COL-5').text
        except:
            awayteam = 'Away Team Error'

        try:
            btts = scrap.find('td', class_='COL-10').text
        except:
            btts = 'BTTS Score Error'

        datenow = str(datetime.date.today())

        print(datenow,hometeam,awayteam,btts)

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

У l oop for scrap in firsttable есть только одна итерация всего содержимого таблицы, поэтому вы находите только первую строку. Вместо использования al oop я бы рекомендовал метод find_all. Это сработало для меня:

url = 'https://www.over25tips.com/both-teams-to-score-tips/'
soup = BeautifulSoup(requests.get(url).content, 'lxml')

firsttable = soup.findAll('table', class_='predictionsTable')[0]
hometeams = [x.text for x in firsttable.find_all('td', {'class': 'COL-3 right-align'})]
awayteams = [x.text for x in firsttable.find_all('td', {'class': 'COL-5 left-align'})]
btts = [x.text for x in firsttable.find_all('td', {'class': 'COL-10 hide-on-small-only'})]
datenow = str(datetime.date.today())

for i in range(len(hometeams)):
    print(datenow, hometeams[i], awayteams[i], btts[i])
0 голосов
/ 13 марта 2020

Второй аргумент конструктора BeautifulSoup - это String. Это тип синтаксического анализатора.
Вы хотите проанализировать html, поэтому вы должны ввести 'html .parser' во втором аргументе.

soup = BeautifulSoup(html, 'lxml') => soup = BeautifulSoup(html, 'html.parser')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...