等待选择器呈现

Wait for selector to present

在使用 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

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

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

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

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

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

如果动态加载该标记,您可以请求主页,为动态内容找到适当的 URL 并单独加载它。一旦你有了它,如果你需要一切,你可以将它插入到第一页,或者单独解析它。