Как очистить страницу с помощью BeautifulSoup?Источник страницы не соответствует элементу проверки - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь почистить несколько вещей из этой страницы фэнтезийного баскетбола .Для этого я использую BeautifulSoup в Python 3.5+.

source_code = requests.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975')
plain_text = source_code.text
soup = BeautifulSoup(plain_text, 'lxml')

Для начала я бы хотел вычеркнуть названия для 9 категорий в список Python.Мой список должен выглядеть так: categories = [FG%, FT%, 3PM, REB, AST, STL, BLK, TO, PTS].

. Я надеялся сделать что-то вроде следующего:

tableSubHead = soup.find_all('tr', class_='Table2__header-row')
tableSubHead = tableSubHead[0]
listCats = tableSubHead.find_all('th')
categories = []
for cat in listCats:
  if 'title' in cat.attrs:
  categories.append(cat.string)

Однако soup.find_all('tr', class_='Table2__header-row') возвращает пустой список вместо таблицыэлемент строки я хочу.Я подозреваю, что это потому, что при просмотре исходного кода страницы он полностью отличается от Inspect Element в Chrome Dev Tools.Я понимаю, что это потому, что Javascript изменяет элементы на странице динамически, но я не уверен, каким будет решение.

Ответы [ 2 ]

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

Проблема, с которой вы сталкиваетесь, заключается в том, что этот веб-сайт является веб-приложением, что означает, что javascript придется запускать для генерации того, что вы видите, вы не можете запустить javascript с помощью request, вот что я сделал сполучите результат с помощью selenium, который откроет безголовый браузер и разрешит выполнение javascript в первую очередь, ожидая некоторый период времени:

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time

# source_code = requests.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975')

options = webdriver.ChromeOptions()
options.add_argument('headless')
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(chrome_options=options, desired_capabilities=capa)
driver.set_window_size(1440,900)
driver.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975')
time.sleep(15)

plain_text = driver.page_source
soup = BeautifulSoup(plain_text, 'lxml')

soup.select('.Table2__header-row') # Returns full results.

len(soup.select('.Table2__header-row')) # 8

Этот подход позволит вам запустить веб-сайт, который разработан как веб-приложение,и значительно расширить вашу функциональность.- Вы даже можете добавить команды для выполнения, такие как прокрутка или щелчок, чтобы загрузить больше источников в полете.

Используйте pip install selenium для установки селена.Также позволяет использовать Firefox, если вы предпочитаете этот браузер.

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

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

Здесь есть один вызов API , который, по-видимому, содержит всю информацию, которую вы ищете.

import requests
payload = {"view":["mMatchupScore","mScoreboard","mSettings","mTeam","modular","mNav"]}
r = requests.get("http://fantasy.espn.com/apis/v3/games/fba/seasons/2019/segments/0/leagues/633975", params=payload).json()

# r is a json object with all the data in it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...