驱动程序没有返回正确的页面来源

时间:2015-08-29 10:36:13

标签: python html selenium selenium-webdriver infinite-scroll

我试图加载一个网页。然后滚动到此页面的最底部(有一个无限滚动)并获取页面源代码。

滚动和加载似乎工作正常,但driver.page_source返回非常短的html,这只是整个page source的一小部分。

def scroll_to_the_bottom(driver):
    old_html = ''
    new_html = driver.page_source
    while old_html != new_html:
        print 'SCROLL'
        old_html = driver.page_source
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(3)
        new_html = driver.page_source


driver.get("http://www.citypaper.com/music/short-list/bcpnews-the-short-list-weird-al-the-heartless-bastards-chastity-belt-more-20150609-story.html")
scroll_to_the_bottom(driver)
print driver.page_source

CONSOLE:

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" data-role="base navhead resizescroll imgsize metrics oopadloader socialshare panelmod transporter"><head><script type="text/javascript" async="" src="//ml314.com/tag.aspx?2972015"></script><script type="text/javascript" async="" src="//ml314.com/tag.aspx?2972015"></script><script async="" src="http://b.scorecardresearch.com/beacon.js"></script><script async="" src="//www.google-analytics.com/analytics.js"></script><script type="text/javascript" src="http://beacon.krxd.net/optout_check?callback=Krux.ns._default.kxjsonp_optOutCheck"></script><script charset="UTF-8" type="text/javascript" src="http://cdn.taboola.com/libtrc/impl.174-RELEASE.js"></script><script async="" src="//widget.perfectmarket.com/tribunedigital-network/load.js"></script><script async="" src="http://b.scorecardresearch.com/beacon.js"></script>
<title>Music Boxes - Baltimore City Paper</title>

      <link rel="dns-prefetch" href="//www.trbimg.com" /><link rel="dns-prefetch" href="//static.chartbeat.com" /><link rel="dns-prefetch" href="//loggingservices.tribune.com" /><link rel="dns-prefetch" href="//m.trb.com" /><link rel="dns-prefetch" href="//b.scorecardresearch.com" /><link rel="dns-prefetch" href="//www.google-analytics.com" /><link rel="dns-prefetch" href="http://pubads.g.doubleclick.net" /><link rel="dns-prefetch" href="https://securepubads.g.doubleclick.net" /><link rel="dns-prefetch" href="//secure-us.imrworldwide.com" /><link rel="dns-prefetch" href="//www.googletagservices.com" /><link rel="dns-prefetch" href="http://ssor.tribdss.com" /><link rel="dns-prefetch" href="//cdn.krxd.net" /><link rel="dns-prefetch" href="//cdn.gigya.com" /><link rel="dns-prefetch" href="//cdn.taboola.com" /><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
    <meta charset="utf-8" />
    <meta name="x-servername" content="i10latisrapp02" />

      <meta name="robots" content="noodp, noydir" />

我使用chromedriver所以我可以清楚地看到它滚动到底部。问题可能在哪里?

编辑:

我已经添加了一个网页。

3 个答案:

答案 0 :(得分:0)

您不能依赖page_source来获取页面的当前状态。 Python文档没有指出它,但是如果你看一下getPageSource的Selenium的Java文档,你会看到:

  

如果页面在加载后已被修改(例如,通过Javascript),则无法保证返回的文本是已修改页面的文本。

您可以要求浏览器序列化DOM。这将生成代表调用时DOM的HTML:

driver.execute_script("return document.documentElement.outerHTML")

答案 1 :(得分:0)

您是否知道在向下滚动时页面内容会加载/卸载?当您向下滚动时,页面将卸载前面的部分。例如,一直向下滚动到页面底部并开始向上滚动。您将看到它正在加载前一部分。

为了证明这一点......当你第一次加载页面时,第一篇文章标题是,&#34;短名单:怪异的Al,无情的混蛋,贞操带,更多&#34;。滚动到页面底部,拉动HTML源(手动),然后搜索该标题。它不存在。

所以,我不知道你要做什么,但如果你想要做的只是加载最后一部分,你可以使用URL http://www.citypaper.com/music/music-boxes/

不同的部分是:

主要文章

http://www.citypaper.com/music/music-features/

http://www.citypaper.com/music/listening-party/

http://www.citypaper.com/music/music-boxes/

为什么你还想要页面的HTML源代码?你想达到什么目的?使用Selenium的一个要点是,您可以使用定位器查找HTML标记,这样您就不必解析源等。

答案 2 :(得分:0)

我有类似的问题。我在get.page_source之后使用time.sleep(5),以便可以读取内容。