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

时间:2019-03-19 11:29:45

标签: python html python-3.x selenium-webdriver

这个问题曾经被问过,但是我已经搜索并尝试过,但仍然无法使它起作用。关于硒,我是一个初学者。

看看: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,但是必须有另一种方式。 / p>

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

4 个答案:

答案 0 :(得分:3)

尝试执行动态生成的内容(JavaScript):

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

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

答案 1 :(得分: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")

答案 2 :(得分:0)

CSS选择器div.rating-text可以正常工作,并且在页面上是唯一的。返回.text将为您提供所需的值。

答案 3 :(得分:0)

下面的脚本回答了一个不同的问题,但我想这就是您所追求的。

@GET
@Path(ApiPath.PATH_BACKEND2)
public String getDataFromProdServer(@QueryParam(ApiParam.PARAM_URL) final String externalUrl ) {
    return mapService.ServerRequest(externalUrl);
}

enter image description here