我一直在使用 Nokogiri 提取 XML 提要,并且运行良好。添加了一个新的提要,我需要拉入它,但它不会一次全部加载。如果我在浏览器中访问 xml feed,我可以看到一组初始数据加载,然后不久就会加载更多数据。当我使用 Nokogiri 时,它只获取初始数据集。我还尝试使用curl来捕获提要,它得到了相同的结果。
如何从 XML feed 中获取所有数据?是否有我可以传递给 Nokogiri 的选项或我可以在curl 上设置的标志?我查看了 Nokogiri 文档和curl 手册页,但无法弄清楚。
当我拉下数据(使用Nokogiri或curl)时,它看起来像这样(尽管有超过2个项目):
<?xml version="1.0" encoding="UTF-8"?>
<item-syndication version="5">
<item id="1">
<more-data >lorem ipsum</more-data>
</item>
<item id="2">
<more-data >lorem ipsum</more-data>
</item>
</item-syndication>
如果我在浏览器中访问该网址,它最初看起来与上面类似,但随后会加载更多项目,如下所示(最终会包含超过 4 个项目):
<?xml version="1.0" encoding="UTF-8"?>
<item-syndication version="5">
<item id="1">
<more-data >lorem ipsum</more-data>
</item>
<item id="2">
<more-data >lorem ipsum</more-data>
</item>
<item id="3">
<more-data >lorem ipsum</more-data>
</item>
<item id="4">
<more-data >lorem ipsum</more-data>
</item>
</item-syndication>
以下是初始请求的请求和响应 header :
以下是图标的请求和响应 header ,以防有帮助:
最佳答案
该页面很可能正在使用 AJAX 加载 XML。 (如果您可以使用 Firebug 获取 XHR,以准确查看他们用来附加新 XML 的 POST 请求,这可能会给您/我们带来更好的想法)
有点遗憾的是,Nokogiri 以及 Mechanize(另一个基于 Nokogiri 构建的 XML 解析/抓取工具)不以任何方式支持 Javascript,因此无法获取推送的数据通过 AJAX 访问页面,无需重新加载页面(这可能是也可能不是您的选择)。
但在循环中,您可以选择每 5 秒加载一次页面(例如 30 秒),并将 XML 与原始抓取进行比较,这样就不会出现重复项。如何执行此操作完全取决于您,但将值存储在 REXML 中并与新抓取的值进行比较似乎并不是最糟糕的选择。
另一种方法是使用完全支持 Javascript 的浏览器模拟器。据我所知,Watir 和 Selenium 可以让您防止重新加载页面以接受传入的更改(尽管我个人也没有使用过,因为我的大部分工作都使用 Mechanize,我已经能够解决 Javascript 问题)通过重新获取页面或手动发送 GET/POST)。使用这两个 gem 的缺点是模拟整个浏览器会变得笨重。
瓦提尔 - http://rubygems.org/gems/watir
Selenium - http://rubygems.org/gems/selenium-webdriver
关于ruby-on-rails - 捕获未立即加载的 xml feed 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18467430/