【问题标题】:Get dynamically generated content with python Selenium使用 python Selenium 获取动态生成的内容
【发布时间】:2019-08-09 22:06:22
【问题描述】:

以前有人问过这个问题,但我已经搜索并尝试过,但仍然无法让它工作。我是 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 保存整个网页时获得的 HTML 文件确实包含我需要的信息,起初我正在考虑使用 pyautogui 来仅 Ctrl + S 每个网页,但必须有另一种方法。

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

【问题讨论】:

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


    【解决方案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")
    

    【讨论】:

    • 那个 CSS 选择器工作正常,它给了我 56,这是“总 ESG 分数”,但这不是我想要找到的那个元素。我正在尝试找到推荐等级,范围从 1 到 5。我尝试过使用 xpath、css_selector、class_name,但无法使其正常工作。
    【解决方案2】:

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

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

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

    【讨论】:

    • 不幸的是,这并没有改变任何东西。我仍然得到与以前相同的 HTML 代码。
    【解决方案3】:

    CSS 选择器div.rating-text 运行良好,并且在页面上是独一无二的。返回 .text 将为您提供您正在寻找的价值。

    【讨论】:

      【解决方案4】:

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

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-30
        • 2023-03-13
        • 2019-01-05
        • 2014-10-22
        • 2021-01-06
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        相关资源
        最近更新 更多