我试图从http://www.dresslink.com/women-woolen-winter-trench-double-button-fur-collar-coat-p-9442.html点击一个名为'估计运费'的链接这将打开一个iframe覆盖,通过ajax获取内容并填充它。
下面是代码
from splinter import Browser
browser = Browser('phantomjs')
def extract(url):
browser.visit(url)
browser.find_by_css(".floatl.shipping_fee a").click()
browser.is_element_present_by_id('global_popup_login_iframe', wait_time=10)
with browser.get_iframe('global_popup_login_iframe') as iframe:
iframe.is_element_present_by_id('dyanmic_shipping_list', wait_time=10)
shippingprice = iframe.find_by_tag('img')
print shippingprice[1]['src']
extract('http://www.dresslink.com/women-woolen-winter-trench-double-button-fur-collar-coat-p-9442.html'
问题是,它似乎无法在iframe内找到一个元素,我已经尝试过find_by_css, by_xpath,结果是相同的。
splinter.exceptions.ElementDoesNotExist: no elements could be found with tag_name "img"
里面肯定有一个img标签,但是它找不到它
我现在发现dyanmic_shipping_list
与id="shipping_rates"
在div
内,而不是在iframe global_popup_login_frame
内。因此,在iframe内搜索将没有结果,因此出现错误。但是调用
browser.find_by_id("dyanmic_shipping_list").find_by_tag("img")[1]['src']
导致
u'http://misc.dresslink.com/nap/images/images_common/icon-china.jpg'
这是你想要的吗?
编辑:我使用firefox作为网页浏览器,而不是phantomjs。两者的命令基本相同,因此您可以使用firefox开发程序,然后让它与phantomjs一起工作。使用firefox,你还可以使用firebug等插件检查页面,这将节省你大量的时间
它没有很好地记录,所以需要一点时间来弄清楚如何去做,我昨晚遇到了同样的问题,所以我在这里张贴我的方法。Splinter有一个非常简单的框架解决方案!
with br.get_iframe('Name_of_iframe') as iframe:
iframe.fill("Name_of_element_to_be_filled","Text_to_be_filled")
在我的例子中,元素的名字是一个随机生成的字符串,所以上面的代码不能使用。如果您遇到这样的问题,请这样做,通过标记找到它(在我的情况下说是输入),从页面源中计算iframe内输入标记的顺序。然后你可以这样写:-
with br.get_iframe('Name_of_iframe') as iframe:
iframe.find_by_tag("tag_to_search")[index_number].fill(text_to_fill)