使用python Selenium获取动态生成的内容

问题描述 投票:2回答:3

之前已经问过这个问题,但是我已经搜索过并尝试过但仍然无法使其工作。对于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的源代码不同。

Image

我使用Chrome DOES保存整个网页时得到的HTML文件包含了我需要的信息,起初我正在考虑使用pyautogui只按Ctrl + S的每个网页,但必须有另一种方式。

我需要的信息显然在html代码中,但是如何在不下载整个网页的情况下获取它?

python html python-3.x selenium-webdriver
3个回答
3
投票

试试这个来执行动态生成的内容(JavaScript):

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

看到类似的问题:Running javascript in Selenium using Python


1
投票

首先,您需要等待元素可点击,然后确保在获得评级之前向下滚动到元素。尝试

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
投票

CSS选择器div.rating-text工作得很好,在页面上是唯一的。返回.text将为您提供您正在寻找的价值。


0
投票

下面的脚本回答了一个不同的问题,但不知怎的,我认为这就是你所追求的。

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

© www.soinside.com 2019 - 2024. All rights reserved.