等待选择器出现

时间:2015-02-13 10:14:22

标签: ruby nokogiri net-http

使用Nokogiri进行网页抓取时,我偶尔会收到以下错误消息

 undefined method `at_css' for nil:NilClass (NoMethodError)

我知道所选元素在某个时间出现,但网站有时响应有点慢,我想这就是我收到错误的原因。

在继续编写脚本之前,有没有办法等到某个选择器出现?

我当前的http请求块看起来像这样

url = URL
body = BODY
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
http.read_timeout = 200 # default 60 seconds
http.open_timeout = 200 # default nil
http.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request.body = body
request["Content-Type"] = "application/x-www-form-urlencoded"
begin
  response = http.request(request)
  doc = Nokogiri::HTML(response.body)
rescue
  sleep 100
  retry
end

1 个答案:

答案 0 :(得分:1)

虽然您可以使用像@Stefan这样的流式Net :: HTTP在他的评论中说明,以及包含Nokogiri的相关处理程序,但您无法使用DOM模型解析部分HTTP文档,即Nokogiri&#39 ; s默认值,因为它也需要完整的文档。

可以使用Nokogiri's SAX parser,但这是一种完全不同的编程风格。

如果您要检索整个页面,请使用OpenURI代替较低级别的Net :: HTTP。它会自动处理Net :: HTTP默认情况下不会执行的一些操作,例如重定向,这使得检索页面变得更加容易,并且可以大大简化代码。

我怀疑问题是网站超时,或者您尝试查找的标记是在实际网页加载后动态加载的。

如果超时,你需要增加等待时间。

如果它动态加载该标记,您可以请求主页面,找到动态内容的相应URL并单独加载。获得后,如果需要,可以将其插入第一页,或者单独解析。