Не удается найти <div ng-view> с веб-сайта статистики NBA с BeautifulSoup Python - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь почистить этот сайт НБА https://stats.nba.com/team/1610612738/. То, что я пытаюсь сделать, это извлечь имя игрока, NO, POS и всю информацию для каждого игрока. Проблема в том, что я не могу найти или мой код не может найти <div ng-view>, который является родителем <nba-stat-table >, где находится таблица.

Пока мой код:

from selenium import webdriver
from bs4 import BeautifulSoup

def get_Player():
    driver = webdriver.PhantomJS(executable_path=r'D:\Documents\Python\Web Scraping\phantomjs.exe')

    url = 'https://stats.nba.com/team/1610612738/'

    driver.get(url)

    data = driver.page_source.encode('utf-8')

    soup = BeautifulSoup(data, 'lxml')

    div1 = soup.find('div', class_="columns / small-12 / section-view-overlay")
    print(div1.find_all('div'))

get_Player()

Ответы [ 3 ]

2 голосов
/ 06 июня 2019

Используйте конечную точку ответа json, которую страница использует для получения этого контента.Намного проще и приятнее в обращении, и нет необходимости в селене.Вы можете найти его на вкладке сети.

import requests
import pandas as pd

r = requests.get('https://stats.nba.com/stats/commonteamroster?LeagueID=00&Season=2018-19&TeamID=1610612738',  headers = {'User-Agent' : 'Mozilla/5.0'}).json()
players_info = r['resultSets'][0]
df = pd.DataFrame(players_info['rowSet'], columns = players_info['headers'])
print(df.head())

enter image description here

1 голос
/ 06 июня 2019

find_all функция всегда возвращает список, findChildren() возвращает все дочерние элементы объекта тега, подробнее

Замените ваш код:

div1 = soup.find('div', class_="columns / small-12 / section-view-overlay")
print(div1.find_all('div')) 

Кому:

div = soup.find('div', {'class':"nba-stat-table__overflow"})
for tr in div.find("tbody").find_all("tr"):
    for td in tr.findChildren():
        print(td.text)

UPDATE:

from selenium import webdriver

from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def get_Player():
    driver = webdriver.PhantomJS(executable_path=r'D:\Documents\Python\Web Scraping\phantomjs.exe')

    url = 'https://stats.nba.com/team/1610612738/'

    driver.get(url)

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "nba-stat-table__overflow")))

    data = driver.page_source.encode('utf-8')

    soup = BeautifulSoup(data, 'lxml')

    div = soup.find('div', {'class':"nba-stat-table__overflow"})
    for tr in div.find("tbody").find_all("tr"):
        for td in tr.findChildren():
            print(td.text)

get_Player()

O / P:

Jayson Tatum
Jayson Tatum
#0
F
6-8
208 lbs
MAR 03, 1998
21
1
Duke
Jonathan Gibson
Jonathan Gibson
#3
G
6-2
185 lbs
NOV 08, 1987
31
2
New Mexico State
....
0 голосов
/ 06 июня 2019

Почему вы хотите найти все div's, если вы хотите извлечь Player имя , вы можете использовать это css selector:

td.player a

Код :

all_player = driver.find_elements_by_css_selector('td.player a')
for playername in all_player:
   print(playername.text)
...