【问题标题】:How to extract "text" from function in a JavaScript through Selenium?如何通过 Selenium 从 JavaScript 中的函数中提取“文本”?
【发布时间】:2021-11-23 08:15:42
【问题描述】:

更新: Jonas提供的脚本已经解决了大部分问题。 现在,我正在尝试找到一种方法来使用 datepicker 或 sendkey 来设置日期范围,因为每次我重新运行代码时都会自动花费一天时间。

date_start = driver.find_element(By.Xpath, 'date_from')
date_end = driver.find_element(By.Xpath, 'date_to')
date_start.sendKeys("2021-09-24")
date_end.sendKeys("2021-10-01")

原问题: 我正在使用 Selenium WebDriver.Chrome 从无法突出显示以从网站复制和粘贴的表中提取数据,当我尝试使用 BeautifulSoup 提取数据时,我发现数据在 JavaScript 的功能下。 Java表的HTML代码是这样的:

<script>

  function initTableData() {
    window.initialAnalystData = [{"action_company":"Initiates Coverage On","action_pt":"Announces","analyst":"BTIG","analyst_name":"James Sullivan","currency":"USD","lastTradePrice":24.89},"logo":null}];
    window.initialAnalystDate = {"date_from":"2021-09-24","date_to":"2021-10-01"};

          window.initialAnalystTime = "11:27";
      }

  initTableData();

</script>

我是 Selenium 和 JavaScript 的新手,但我尝试了以下代码来获取数据列表,但它不起作用。

element = driver.findElement(By.tagName("script"));
htmlCode = driver.executeScript("return arguments[0].innerHTML;", element)

接下来我应该尝试什么? 网址是here

谢谢!

【问题讨论】:

  • 如果你要运行 javascript,你可以得到“window.initialAnalystData, etc...”。你也可以从 DOM 中获取你需要的信息。
  • 感谢您的建议!我以后一定会尝试运行它!

标签: javascript python selenium


【解决方案1】:

您可以使用正则表达式找到该部分,然后使用它:

from selenium import webdriver
import time
import re

url = 'https://www.benzinga.com/analyst-ratings'
driver.get(url)
time.sleep(5) #Let it load all the data first

htmlSource = driver.page_source
raw_data = re.findall(r'window.initialAnalystData = .*;', htmlSource)[0][29:].split('{')[1:]


#clean data if you want (just one possible way out of many!):

cleaned_data = {}
for data in raw_data:
    clean_data = data.split(',')
    details_to_dic = {}
    for details in clean_data:
        details_temp = details.replace('"', '')
        details_temp = details_temp.split(':')
        try:
            details_to_dic[details_temp[0]] = details_temp[1]
        except:
            pass

    cleaned_data[details_to_dic['name']] = details_to_dic

因此您将数据作为字典(公司 APA 的示例数据):

print(cleaned_data['APA'])

输出:

{'action_company': 'Downgrades', 'action_pt': 'Lowers', 'analyst': 'Citigroup', 'analyst_name': 'Scott Gruber', 'currency': 'USD', 'date': '2021-10-01', 'exchange': 'NASDAQ', 'id': '61573ba273a5f300019bb64a', 'importance': '0', 'name': 'APA', 'notes': '', 'pt_current': '23.0000', 'pt_prior': '27.0000', 'rating_current': 'Neutral', 'rating_prior': 'Buy', 'ticker': 'APA', 'time': '12', 'updated': '1633106928', 'url': 'https', 'url_calendar': 'https', 'url_news': 'https', 'quote': ''}

【讨论】:

  • 非常感谢!它就像一个魅力!但现在我正在尝试使用发送键和 XPath 来选择日期范围。但是很难找到,因为它在窗口脚本中。
  • 您可以通过 xpath 找到它,然后使用 driver.find_element_by_xpath('PATH HERE').click()。例如试试这个: driver.find_element_by_xpath('//*[@id="analyst-calendar"]/div/div[2]/div/div/div/div[2]/div[2]/div[1 ]/div[2]/div/div/div[1]/div[3]/span/span').click()
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多