Не удается обратится к div, нет атрибута 'find'
Код:
def get_html(url):
print(url)
r = requests.get(url)
return r.text
def get_data(html):
soup = BeautifulSoup(html, 'lxml')
pl_list = soup.find('div', id='80').find('div', _class='ReactVirtualized__Grid ReactVirtualized__List')
return pl_list
def main():
Ошибка:
'NoneType' object has no attribute 'find'
Почему не удается обратится к контейнеру и забрать его содержимое? Когда, как html код всей страницы возвращается, но обратится к конкретному контейнеру не могу, появляется ошибка (описана выше). Пожалуйста помогите разобраться?
PS Это мой первый опыт написания, парсера...
Ответы (1 шт):
По url, указанному в вопросе, вам отдают только html-оболочку, плюс кучу скриптов, которые загружают и показывают контент на странице... Ищите в браузере через панель разработчика (chrome: F12, Network, XHR чаще всего) откуда приходят нужные данные и делайте запрос туда.
Например, для вашего случая можно найти ендпоинт api вида /api/v1/sport/tennis/scheduled-events/:
import json
import requests
url = 'https://api.sofascore.com/api/v1/sport/tennis/scheduled-events/2021-02-09'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'}
r = requests.get(url, headers=headers)
data = json.loads(r.content)
Теперь у вас в data словарь с единственным ключом events, в котором список словарей, где есть данные про теннис, насколько я понимаю, за 2021-02-09:
for e in data['events']:
print(f"{e['tournament']['name']}: {e['homeTeam']['name']} vs {e['awayTeam']['name']}")
выведет:
Australian Open, Melbourne, Australia: Harris L. vs Torpegaard M.
Australian Open, Melbourne, Australia: Mcdonald M. vs Cecchinato M.
Australian Open, Melbourne, Australia: Monteiro T. vs Martin A.
...
Sharm El Sheikh, Singles Qualifying M-ITF-EGY-06A: Maxted L. vs Bertola R.
Grenoble, Singles Qualifying W-ITF-FRA-02A: Niemeier J. vs Rubini S.
Grenoble, Singles Qualifying W-ITF-FRA-02A: Radwańska U. vs Desperrier G.