Распарсить 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