之前我已经使用Watir成功进行网页搜索,但我在抓取这个特定网页时遇到了麻烦。
https://kroger.softcoin.com/programs/kroger/digital_coupons/?banner=Smiths&origin=DigitalCoupons
当我在常规浏览器上访问该页面时,我可以看到该页面每次重新加载两到三次,并且我在想这个问题来自哪里。我尝试过使用
Watir::Wait.until { @browser.div(id: "offer-105653").visible? }
但这不起作用。我已成功将上述代码用于其他网页作为测试,但它似乎并不适用于Kroger网站。我不确定如何解决。
def save
require 'watir'
require 'phantomjs'
@browser = Watir::Browser.new:phantomjs
@browser.goto "https://kroger.softcoin.com/programs/kroger/digital_coupons/?banner=Smiths&origin=DigitalCoupons"
@browser.li(id: "1768173").wait_until(&:present?).text
@products = @browser.divs
@products.each do |x|
Smith.create(title: x.text)
end
end
答案 0 :(得分:1)
#visible?
假设元素首先存在。如果它在DOM中不存在,它将立即引发异常而不是继续等待,因此通常不是您在轮询元素时要使用的内容。
尝试:
@browser.div(id: "offer-105653").wait_until(&:present?).text`
答案 1 :(得分:1)
可能发生的事情是幕后的webdriver或watir正在尝试使用CSS选择器来选择该元素。
问题是,在HTML4下不允许以数字开头的ID值,但现在允许在HTML5中使用。但是,尽管在HTML5中被允许,但CSS选择不允许通过以数字开头的ID进行选择,除非您感到棘手。为了工作,你必须逃避第一个角色。
如果您导航到该页面并发出$$("#\\31 755189")
之类的命令,您可以在开发者控制台中看到这一点,它会找到该元素。但是,如果您尝试$$("#1768173")
,您将看到无效的选择器错误。 (请注意,这些示例可能仅在短时间内有效,因为这是一个可能会发生变化的动态页面
我建议您在代码中尝试以下操作,看看是否有效。
@browser.li(id: "\\31 768173").wait_until(&:present?).text
如果确实有效,那么为了让它能够在不转义第一个数字的情况下工作,watir开发人员可能需要添加特殊情况逻辑来通过ID来选择当它是数字时转义第一个字符