Python Beautifulsoup (bs4) findAll не все элементы - PullRequest
4 голосов
/ 21 марта 2019

По URL-адресу, указанному в коде, я в конечном итоге пытаюсь собрать все имена игроков со страницы.Однако, когда я использую .findAll для получения всех элементов списка, я еще не достиг успеха.Пожалуйста, сообщите.

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

players_url = 'https://stats.nba.com/players/list/?Historic=Y'

# Opening up the Connection and grabbing the page
uClient = uReq(players_url)
page_html = uClient.read()

players_soup = soup(page_html, "html.parser")

# Taking all of the elements from the unordered lists that contains all of the players.

list_elements = players_soup.findAll('li', {'class': 'players-list__name'})

Ответы [ 3 ]

3 голосов
/ 21 марта 2019

Как @ Oluwafemi Sule предположил, что лучше использовать selenium вместе с BS:

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://stats.nba.com/players/list/?Historic=Y')
soup = BeautifulSoup(driver.page_source, 'lxml')
for div in soup.findAll('li', {'class': 'players-list__name'}):
    print(div.find('a').contents[0])

Выход:

Abdelnaby, Alaa
Abdul-Aziz, Zaid
Abdul-Jabbar, Kareem
Abdul-Rauf, Mahmoud
Abdul-Wahad, Tariq

и т.д.

1 голос
/ 21 марта 2019

Вы можете сделать это только с запросами, потянув прямо из скрипта js, который предоставляет имена.

import requests
import json

r = requests.get('https://stats.nba.com/js/data/ptsd/stats_ptsd.js')
s = r.text.replace('var stats_ptsd = ','').replace('};','}')
data = json.loads(s)['data']['players']
players = [item[1] for item in data]
print(players)
0 голосов
/ 21 марта 2019

Как указано @ Oluwafemi Sule ), упомянутое в комментарии:

Список игроков, сгенерированных на странице, составлен с использованием JavaScript.

Вместо использования Selenium, я рекомендую вам этот пакет reports-html , созданный автором очень популярных запросов .Он использует Chromium для визуализации содержимого JavaScript.

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://stats.nba.com/players/list/?Historic=Y')
r.html.render()
for anchor in r.html.find('.players-list__name > a'):
    print(anchor.text)

Вывод:

Abdelnaby, Alaa
Abdul-Aziz, Zaid
Abdul-Jabbar, Kareem
Abdul-Rauf, Mahmoud
Abdul-Wahad, Tariq
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...