【问题标题】:Splinter saves bodiless htmlSplinter 保存无实体的 html
【发布时间】:2015-09-17 21:54:11
【问题描述】:

我在 Linux 平台上使用 python 2.7.2 中的 splinter 0.7.3 模块使用默认的 Firefox 浏览器在网站上抓取目录列表。

这是通过单击 html 中的“下一步”链接遍历分页网页列表的代码的 sn-p。

    links = True
    i = 0
    while links:
        with open('html/register_%03d.html' % i, 'w') as f:
            f.write(browser.html.encode('utf-8'))
        links = browser.find_link_by_text('Next')
        print 'links:', links
        if links:
            links[0].click()
        i += 1

我知道这些链接可以正常工作,因为我看到的输出如下所示:

links: [<splinter.driver.webdriver.WebDriverElement object at 0x2e6da10>, <splinter.driver.webdriver.WebDriverElement object at 0x2e6d710>]
links: [<splinter.driver.webdriver.WebDriverElement object at 0x2e6d5d0>, <splinter.driver.webdriver.WebDriverElement object at 0x2e6d950>]
links: [<splinter.driver.webdriver.WebDriverElement object at 0x2e6d710>, <splinter.driver.webdriver.WebDriverElement object at 0x2e6dcd0>]
links: []

当使用f.write(browser.html.encode('utf-8')) 将html 保存在每个页面时,它在第一页上工作正常。在随后的页面上,虽然我可以看到在 Firefox 中呈现的页面,但 html/regiser_...html 文件为空或缺少 body 标签,如下所示:

<!DOCTYPE html>
<!--[if lt IE 7]>      <html prefix="og: http://ogp.me/ns#" class="no-js lt-ie9 lt-ie8 lt-ie7"  lang="en-gb"> <![endif]-->
<!--[if IE 7]>         <html prefix="og: http://ogp.me/ns#" class="no-js lt-ie9 lt-ie8"  lang="en-gb"> <![endif]-->
<!--[if IE 8]>         <html prefix="og: http://ogp.me/ns#" class="no-js lt-ie9"  lang="en-gb"> <![endif]-->
<!--[if gt IE 8]><!-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-gb" class="no-js" prefix="og: http://ogp.me/ns#"><!--<![endif]--><head>
        <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible" />    
    ...
  </style>
  <script src="/media/com_magebridge/js/frototype.min.js" type="text/javascript"></script></head></html>

这是从 splinter 中保存 html 的已知功能吗?有没有更好的方法?

【问题讨论】:

  • 我刚刚尝试将 Mint Lisa 的 Firefox 版本从 7.0.1 升级到 20.0 。问题依然存在。

标签: python screen-scraping splinter


【解决方案1】:

看起来确实是时间问题 - 当页面未完全加载时,您正在获取页面源。有几种方法可以解决这个问题:

  • 等待bodyto be present

    browser.is_element_present_by_tag("body", wait_time=5)
    
  • 增加page load timeout - 在初始化browser 对象后立即添加:

    browser.driver.set_page_load_timeout(10)  # 10 seconds
    

【讨论】:

  • 只是想确认您收到了赏金。我正在度假并通过手机进行此操作。
  • @ChrisGuest 谢谢,得到了赏金。希望答案有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多