使用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
答案 0 :(得分:1)
虽然您可以使用像@Stefan这样的流式Net :: HTTP在他的评论中说明,以及包含Nokogiri的相关处理程序,但您无法使用DOM模型解析部分HTTP文档,即Nokogiri&#39 ; s默认值,因为它也需要完整的文档。
你可以使用Nokogiri's SAX parser,但这是一种完全不同的编程风格。
如果您要检索整个页面,请使用OpenURI代替较低级别的Net :: HTTP。它会自动处理Net :: HTTP默认情况下不会执行的一些操作,例如重定向,这使得检索页面变得更加容易,并且可以大大简化代码。
我怀疑问题是网站超时,或者您尝试查找的标记是在实际网页加载后动态加载的。
如果超时,你需要增加等待时间。
如果它动态加载该标记,您可以请求主页面,找到动态内容的相应URL并单独加载。获得后,如果需要,可以将其插入第一页,或者单独解析。