Невозможно получить доступ к таблице внутри div (баскетбольная ссылка) - PullRequest
0 голосов
/ 28 апреля 2019

В настоящее время я пишу скрипт на Python, и часть его получает победителей с первых 4 сезонов карьеры каждого игрока в драфте NBA между 2005 и 2015 годами. Я возился с этим почти 2 часа (получая все больше и больше)разочарован), но я не смог получить акции для отдельных игроков.Я пытаюсь использовать таблицу «Advanced» по следующей ссылке в качестве контрольного примера: https://www.basketball -reference.com / Players / b / bogutan01.html # advanced :: none

При получении имен игроков с черновиков страниц у меня не было проблем, но я пробовал так много итераций следующего кода и не смог получить доступ к элементу td со статистикой.

playerSoup = BeautifulSoup(playerHtml)
        playertr = playerSoup.find_all("table", id = "advanced").find("tbody").findAll("tr")
        playerws = playertr.findAll("td")[21].getText()

1 Ответ

1 голос
/ 28 апреля 2019

Эта страница использует JavaScript для добавления таблиц, но не читает данные с сервера. Все таблицы в HTML, но в виде комментариев <!-- ... ->

Используя BeautifulSoup, вы можете найти все комментарии, а затем проверить, какой из них имеет текст "Advanced". И тогда вы можете использовать этот комментарий как обычный HTML в BeautifulSoup

import requests
from bs4 import BeautifulSoup
from bs4 import Comment

url = 'https://www.basketball-reference.com/players/b/bogutan01.html#advanced::none'

r = requests.get(url)

soup = BeautifulSoup(r.content)

all_comments = soup.find_all(string=lambda text: isinstance(text, Comment))

for item in all_comments:
    if "Advanced" in item:
        adv = BeautifulSoup(item)

        playertr = adv.find("table", id="advanced")

        if not playertr:
            #print('skip')
            continue # skip comment without table - go back to `for`

        playertr = playertr.find("tbody").findAll("tr")
        playerws = adv.find_all("td")[21].getText()

        print('playertr:', playertr)
        print('playerws:', playerws)

        for row in playertr:
            if row:
                print(row.find_all('th')[0].text)
                all_td = row.find_all('td')
                print([x.text for x in all_td])
                print('--')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...