等待选择器出现



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

 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

虽然你可以像@Stefan在他的评论中所说的那样使用流式Net::HTTP,以及包括Nokogiri的相关处理程序,但你不能使用DOM模型来解析部分HTTP文档,这是Nokogiri的默认模型,因为它也需要完整的文档。

可以使用Nokogiri的SAX解析器,但这是一种完全不同的编程风格。

如果要检索整个页面,请使用OpenURI,而不是较低级别的Net::HTTP。它自动处理Net::HTTP默认情况下不会做的许多事情,例如重定向,这使检索页面变得更容易,并将大大简化代码。

我怀疑问题是网站超时了,或者你试图找到的标签是在实际页面加载后动态加载的。

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

如果是动态加载该标记,则可以请求主页,找到动态内容的适当URL,然后单独加载。一旦你有了它,如果你需要所有东西,你可以把它插入到第一页,或者只是单独解析它。

最新更新