斯普林特救脱体html
Splinter saves bodiless html
我在 Linux 平台上使用 python 2.7.2
中的 splinter 0.7.3
模块来抓取使用默认 Firefox 浏览器的网站上的目录列表。
这是通过单击 html 中的 'Next' link 遍历分页 Web 列表的代码片段。
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
我知道 link 正在工作,因为我看到的输出如下所示:
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 的已知功能吗?有更好的方法吗?
这看起来确实像是一个时间问题 - 您在页面未完全加载时获取页面源代码。有几种方法可以解决这个问题:
等待body
to 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
我在 Linux 平台上使用 python 2.7.2
中的 splinter 0.7.3
模块来抓取使用默认 Firefox 浏览器的网站上的目录列表。
这是通过单击 html 中的 'Next' link 遍历分页 Web 列表的代码片段。
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
我知道 link 正在工作,因为我看到的输出如下所示:
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 的已知功能吗?有更好的方法吗?
这看起来确实像是一个时间问题 - 您在页面未完全加载时获取页面源代码。有几种方法可以解决这个问题:
等待
body
to 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