【问题标题】:selenium not able to retrieve/read part of the website硒无法检索/读取网站的一部分
【发布时间】:2016-07-09 00:21:02
【问题描述】:

我试图做一个自动脚本来下载一些外汇价格历史数据。这些数据可在

https://www.dukascopy.com/swiss/english/marketwatch/historical/

但是,如果我只是使用 Selenium 来检索网站的一部分,无论我等待多长时间,我都无法在网站中找到这个元素:

<iframe src="https://freeserv.dukascopy.com/2.0/?path=historical_data_feed/index&amp;header=false&amp;availableInstruments=l%3A&amp;width=100%25&amp;height=600&amp;adv=popup" border="0" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" width="100%" height="600"></iframe>

显然,selenium 唯一能读取的是 : 前面的两个元素

<script type="text/javascript">DukascopyApplet = {"type":"historical_data_feed","params":{"header":false,"availableInstruments":"l:","width":"100%","height":"600","adv":"popup"}};</script>

<script type="text/javascript" src="https://freeserv.dukascopy.com/2.0/core.js"></script>

有人知道如何解决这个问题吗?非常感谢。

【问题讨论】:

    标签: python selenium web-crawler


    【解决方案1】:

    Wait for the presence 框架,然后切换到它。然后,你可以寻找里面的元素:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    driver = webdriver.Firefox()
    driver.get("https://www.dukascopy.com/swiss/english/marketwatch/historical/")
    
    # wait for the frame to load and switch
    wait = WebDriverWait(driver, 10)
    iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".mainContentBody iframe")))
    driver.switch_to.frame(iframe)
    
    # print out the bold radio button style texts
    for item in driver.find_elements_by_css_selector("ul > li[data-group][data-instrument] strong"):
        print(item.text)
    
    driver.close()
    

    打印:

    ADS.DE
    ALV.DE
    AUD/CAD
    AUD/CHF
    AUD/JPY
    ...
    VOW3.DE
    XAG/USD
    XAU/USD
    ZAR/JPY
    

    【讨论】:

    • 非常感谢您的回复。两个非常愚蠢的后续问题:1. 为什么我们需要做driver.switch_to.frame(iframe),我之前尝试过 ImplicitWait 但没有包含 switch_to.frame(),它没有锻炼 2. 我复制了你在这里写下的所有内容,但控制台没有打印出任何东西。除了你的,我尝试了以下 CSS 选择器,所有结果都没有找到任何东西: * li.N-eb-fb-gb * ul &gt; li strong 我确实能够找到两个 &lt;ul&gt;s,如网页所示。再次感谢!
    • 好的,我想我明白了,如果我在driver.switch_to.frame(iframe) 之后明确地让一些时间睡觉,比如time.sleep(3),我可以得到你所有的打印输出。但这真的很奇怪。切换不应该等到所有元素都加载完毕后再切换到它?
    • @ShaunZiqinRong time.sleep() 不是解决时间问题的最佳方法。在这里也使用相同的wait.until() 方法。切换到框架后做wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "ul &gt; li[data-group][data-instrument] strong")))然后得到结果。
    • 谢谢。在这种情况下,selenium 会等到它捕获相应选择器的所有元素,还是会等到它捕获第一个满足选择器的元素?我测试了与 time.sleep() 的比较,似乎它捕获了所有令人满意的元素。
    • @ShaunZiqinRong 它捕获了第一个,但在这种情况下,这是页面加载的一个很好的指标。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2010-12-05
    • 2013-08-18
    • 2012-11-09
    相关资源
    最近更新 更多