Соскрести текст, который был написан с помощью javascript с сайта - PullRequest
0 голосов
/ 06 сентября 2018

Я использую BeautifulSoup для сбора информации о персонаже с веб-сайта. При попытке получить показатель выигрыша персонажа BeautifulSoup не может его найти.

Когда я проверяю текст, он указывается ниже. Все, что я могу найти в исходном коде сайтов, и все, что находит BeautifulSoup, это "rating-stats-placeholder".

Это код, который я сейчас использую.

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

my_url = "https://u.gg/lol/champions/darius/build/?role=top"

#opening up connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

#html parsing
page_soup = soup(page_html, "html.parser")

#champion name
champ_name = page_soup.findAll("span", {"class":"champion-name"})[0].text

#champion win rate
champ_wr = page.soup.findAll("div", {"class":"win-rate okay-tier"})

Я считаю, что текст о ставке выигрыша добавляется с помощью javascript, но я понятия не имею, как мне получить этот текст. Код, который у меня есть, возвращает "None" для champ_wr

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

не уверен, насколько вы привязаны к BeautifulSoup, но я могу заставить селен делать полезные вещи с:

# load code from selenium package
from selenium.webdriver import Remote
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# start an instance of Chrome up
chrome = Service('/usr/local/bin/chromedriver')
chrome.start()
driver = Remote(chrome.service_url)

# get the page loading
driver.get("https://u.gg/lol/champions/darius/build/?role=top")

# wait for the win rate to be populated
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "win-rate")))

# get the values you wanted
name = driver.find_element_by_class_name("champion-name").text
winrate = driver.find_element_by_class_name("win-rate").text

# display them
print(f"name: {repr(name)}, winrate: {winrate.split()[0]}")

# clean up a bit
driver.quit()
0 голосов
/ 06 сентября 2018

Хотя этот текст технически может быть в самом javascript, я думаю, что JS извлекает его через ajax-запрос. Имейте в виду, что ваша программа имитирует это, и вы, вероятно, получите все данные, которые вам нужны, без каких-либо проблем!

Хотя это займет немного детективной работы. Я предлагаю включить регистратор сетевого трафика (например, «Панель инструментов веб-разработчика» в Firefox), а затем посетить сайт. Сосредоточьте свое внимание на любых / всех запросах XmlHTTP.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...