Как веб-царапать стартовый состав для НБА? - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в изучении веб-страниц и могу использовать некоторую помощь.Я хотел бы очистить стартовый состав НБА, команды и позиции игроков, используя Xpath.Я только начал с имен, потому что я столкнулся с проблемой.

Вот мой код:

from urllib.request import urlopen
from lxml.html import fromstring 


url = "https://www.lineups.com/nba/lineups"

content = str(urlopen(url).read())
comment = content.replace("-->","").replace("<!--","")
tree = fromstring(comment)


for nba, bball_row in enumerate(tree.xpath('//tr[contains(@class,"t-content")]')):
    names = bball_row.xpath('.//span[@_ngcontent-c5="long-player-name"]/text()')[0]
    print(names)

Похоже, что программа работает без ошибок, но имена не печатаются.Будем весьма благодарны за любые советы о том, как более эффективно анализировать использование Xpath.Я попытался возиться с помощником Xpath и Xpath Finder.Может быть, есть некоторые хитрости, чтобы облегчить процесс.Заранее спасибо за ваше время и усилия!

1 Ответ

0 голосов
/ 23 октября 2018

Обязательный контент, расположенный внутри script узла, который выглядит как

<script nonce="STATE_TRANSFER_TOKEN">window['TRANSFER_STATE'] = {...}</script>

. Вы можете попробовать выполнить следующие действия для извлечения данных в виде простого словаря Python:

import re
import json
import requests

source = requests.get("https://www.lineups.com/nba/lineups").text
dictionary = json.loads(re.search(r"window\['TRANSFER_STATE'\]\s=\s(\{.*\})<\/script>", source).group(1))

Опционально: Вставьте сюда вывод dictionary и нажмите «Украсить», чтобы увидеть данные как читаемые JSON

Затем вы можете получить доступ к требуемому значению по ключу, например,

for player in dictionary['https://api.lineups.com/nba/fetch/lineups/gateway']['data'][0]['home_players']:
    print(player['name'])

Kyrie Irving
Jaylen Brown
Jayson Tatum
Gordon Hayward
Al Horford

for player in dictionary['https://api.lineups.com/nba/fetch/lineups/gateway']['data'][0]['away_players']:
    print(player['name'])

D.J. Augustin
Evan Fournier
Jonathan Isaac
Aaron Gordon
Nikola Vucevic

Обновление

Наверное, я только что сделал это слишком сложно:)

Это должно быть так просто, как показано ниже:

import requests

source = requests.get("https://api.lineups.com/nba/fetch/lineups/gateway").json()
for player in source['data'][0]['away_players']:
        print(player['name'])

Обновление 2

Чтобы получить составы всех команд, используйте ниже:

import requests

source = requests.get("https://api.lineups.com/nba/fetch/lineups/gateway").json()

for team in source['data']:
    print("\n%s players\n" % team['home_route'].capitalize())
    for player in team['home_players']:
        print(player['name'])
    print("\n%s players\n" % team['away_route'].capitalize())
    for player in team['away_players']:
        print(player['name'])
...