Распарсить html страницу с помощью пайтона

Есть страница https://www.leovegas.com/en-in/popular, необходимо вытащить оттуда все названия игр. Владею немного пайтоном( Анаконда).Нашла на просторах сети и адаптировала под себя. но не работает:

def read_file(filename):
    with open(filename, encoding='utf-8') as input_file:
        text = input_file.read()
    return text



def parse_user_datafile_bs(filename):
    results = []
    text = read_file(filename)

    soup = BeautifulSoup(text)
    film_list = soup.find('div', {'class': '_1PGOG'})
    items = film_list.find_all('div', {'class': ['_1PGOG']})
    for item in items:
        # getting movie_id
        movie_link = item.find('a', {'class': '_3efGW'}).find('a').get('href')
        movie_desc = item.find('a', {'class': '_3efGW'}).find('a').text
        #movie_id = re.findall('\d+', movie_link)[0]

        # getting english name
#         name_eng = item.find('div', {'class': 'nameEng'}).text

#         #getting watch time
#         watch_datetime = item.find('div', {'class': 'date'}).text
#         date_watched, time_watched = re.match('(\d{2}\.\d{2}\.\d{4}), (\d{2}:\d{2})', watch_datetime).groups()

#         # getting user rating
#         user_rating = item.find('div', {'class': 'vote'}).text
#         if user_rating:
#             user_rating = int(user_rating)

        results.append({
                'game': movie_id

            })
    return results
parse_user_datafile_bs('LeoVegas.html')

Ответы (2 шт):

Автор решения: Danila Manturov

Скорее всего контент генерируется динамически. Таким способом вы его не получите. Используйте эмулятор браузера. Вот эта библиотека вполне подойдёт: Selenium

→ Ссылка
Автор решения: gil9red

Этот сайт заблокирован моим провайдером, возиться с прокси для requests не стал, да и ваш пример работает с файлом, поэтому, думаю ничего страшного нет.

  • Скачал из браузера страницу
  • Делаю парсинг
  • Для поиска игр ищу теги <a>, у которых в ссылке есть строка /game/
  • У найденных атрибутов ищу все div и те, которые всегда последние и будут содержать название игры

Пример:

from bs4 import BeautifulSoup

content = open('https _www.leovegas.com_en-in_popular.html', 'rb').read()
root = BeautifulSoup(content, 'html.parser')

for x in root.select('a[href*="/game/"]'):
    div = x.select('div')[-1]
    title = div.get_text(strip=True)
    print(title)

    # Hot Spin
    # Reel King Mega
    # ...
    # El Dorado Infinity Reels
    # Rick and Morty MEGAWAYS

Второй вариант возможен из-за того, что данные по играм находятся на странице в куске javscript, в переменной window.__INITIAL_STATE:

window.__INITIAL_STATE = {"query:StructureQuery:{}":{ ...

Алгоритм:

  • Вытаскиваем этот кусок через регулярное выражение
  • Парсим его в JSON
  • Вытаскиваем игры в удобном формате

Пример:

import json
import re
import sys

with open('https _www.leovegas.com_en-in_popular.html', encoding='utf-8') as f:
    text = f.read()

m = re.search('window.__INITIAL_STATE = ({.+});', text)
if not m:
    print('Not found "window.__INITIAL_STATE"!')
    sys.exit(1)

data = json.loads(m.group(1))

query = data['query:CasinoCategoryScreenQuery:{invalidPath:false,lobbyId:"TG9iYnk6Y2FzaW5v",slug:"popular",urlPath:"/popular"}']
items = query['data']['category']['games']['edges']
for node in items:
    title = node['node']['name']
    print(title)

# Hot Spin
# Reel King Mega
# LeoVegas MEGAWAYS
# ...
# Volatile Slot
# El Dorado Infinity Reels
# Rick and Morty MEGAWAYS
→ Ссылка