Получите динамически генерируемый контент с помощью Python Selenium - PullRequest
2 голосов
/ 19 марта 2019

Этот вопрос уже задавался, но я искал и пытался, но все еще не могу заставить его работать. Я начинающий, когда дело доходит до Selenium.

Посмотрите на: https://finance.yahoo.com/quote/FB

Я пытаюсь очистить «Рекомендованный рейтинг», который в данном случае на момент написания статьи равен 2. Я пробовал:

driver.get('https://finance.yahoo.com/quote/FB')
time.sleep(10)
rating = driver.find_element_by_css_selector('#Col2-4-QuoteModule-Proxy > div > section > div > div > div')
print(rating.text)

... что не дает мне ошибки, но и не печатает текст. Я также попытался с xpath, class_name и т. Д. Вместо этого я попытался:

source = driver.page_source
print(source)

Это тоже не работает, я просто получаю фактический источник без динамически сгенерированного контента. Когда я нажимаю «Просмотреть источник» в Chrome, его там нет. Я попытался сохранить веб-страницу в Chrome. Не сработало.

Затем я обнаружил, что если я сохраняю всю веб-страницу, включая изображения, css-файлы и все остальное, исходный код отличается от того, где я просто сохраняю HTML.

Изображение

HTML-файл, который я получаю, когда сохраняю всю веб-страницу с помощью Chrome, содержит необходимую мне информацию, и сначала я думал об использовании pyautogui для простого нажатия Ctrl + S на каждой веб-странице, но должен быть другой способ.

Информация, которая мне нужна, есть в html-коде, но как ее получить без загрузки всей веб-страницы?

Ответы [ 4 ]

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

Попробуйте выполнить динамически сгенерированный контент (JavaScript):

driver.execute_script("return document.body.innerHTML")

Смотрите похожие вопросы: Запуск javascript в Selenium с использованием Python

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

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

element.location_once_scrolled_into_view
element.text

РЕДАКТИРОВАТЬ:

Используйте следующий селектор XPath:

'//a[@data-test="recommendation-rating-header"]//following-sibling::div//div[@class="rating-text Arrow South Fw(b) Bgc($buy) Bdtc($buy)"]'

И чем у вас будет:

rating = driver.find_element_by_css_selector('//a[@data-test="recommendation-rating-header"]//following-sibling::div//div[@class="rating-text Arrow South Fw(b) Bgc($buy) Bdtc($buy)"]')

Извлечьзначение ползунка, используйте

val = rating.get_attribute("aria-label")
0 голосов
/ 14 июня 2019

Сценарий ниже отвечает на другой вопрос, но почему-то я думаю, что это то, что вам нужно.

import requests
from bs4 import BeautifulSoup

base_url = 'http://finviz.com/screener.ashx?v=152&s=ta_topgainers&o=price&c=0,1,2,3,4,5,6,7,25,63,64,65,66,67'
html = requests.get(base_url)
soup = BeautifulSoup(html.content, "html.parser")
main_div = soup.find('div', attrs = {'id':'screener-content'})

light_rows = main_div.find_all('tr', class_="table-light-row-cp")
dark_rows = main_div.find_all('tr', class_="table-dark-row-cp")

data = []
for rows_set in (light_rows, dark_rows):
    for row in rows_set:
        row_data = []
        for cell in row.find_all('td'):
            val = cell.a.get_text()
            row_data.append(val)
        data.append(row_data)

#   sort rows to maintain original order
data.sort(key=lambda x: int(x[0]))

import pandas
pandas.DataFrame(data).to_csv("AAA.csv", header=False)

enter image description here

0 голосов
/ 19 марта 2019

Селектор CSS, div.rating-text, работает просто отлично и уникален на странице. Возвращение .text даст вам искомое значение.

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