【问题标题】:Nokogiri parsing multiple XML feeds at once and sort by dateNokogiri 一次解析多个 XML 提要并按日期排序
【发布时间】:2013-01-27 00:13:43
【问题描述】:

我正在使用 Rails 和 Nokogiri 来解析一些 XML 提要。

我已经解析了一个 XML 提要,我想解析多个提要并按日期对项目进行排序。它们是 Wordpress 提要,因此它们具有相同的结构。

在我的控制器中,我有:

def index
  doc = Nokogiri::XML(open('http://somewordpressfeed'))  
  @content = doc.xpath('//item').map do |i| 
  {'title' => i.xpath('title').text, 'url' => i.xpath('link').text, 'date' => i.xpath('pubDate').text.to_datetime} 
  end
end

在我看来,我有:

<ul>
  <% @content.each do |l| %>
    <li><a href="<%= l['url'] %>"><%= l['title'] %></a> ( <%= time_ago_in_words(l['date']) %> )</li>
  <% end %>
</ul> 

上面的代码可以正常工作。我尝试解析多个提要并收到 404 错误:

  feeds = %w(wordpressfeed1, wordpressfeed2)
  docs = feeds.each { |d| Nokogiri::XML(open(d)) }

我如何解析多个提要并将它们添加到哈希中,就像使用一个 XML 提要一样?我需要在页面加载时一次解析大约 50 个 XML 提要。

【问题讨论】:

  • 404 只是告诉 url 不存在?您确定这些 URL 有效吗?您拥有的其他代码应该没问题。
  • OpenURI::HTTPError in PublicController#index 404 Not Found
  • 'feeds = %w(wordpressfeed1, wordpressfeed2)' 是伪代码吗?如果是,那么您将字符串“wordpressfeed1”作为网址,您的意思是:'feeds = [wordpressfeed1, wordpressfeed2]'?
  • 我有真正的 urls 到 wordpress 提要.. 我刚刚为这个问题创建了一个示例..

标签: ruby-on-rails ruby nokogiri


【解决方案1】:

我会用不同的方式来写。

尝试更改 index 以接受 URL 数组,然后使用 map 循环遍历它们,将结果连接到一个数组,然后返回:

def index(*urls)
  urls.map do |u|
    doc = Nokogiri::XML(open(u))  
    doc.xpath('//item').map do |i| 
      {
        'title' => i.xpath('title').text,
        'url' => i.xpath('link').text,
        'date' => i.xpath('pubDate').text.to_datetime
      } 
    end
  end
end

@content = index('url1', 'url2')

使用符号而不是字符串作为哈希键会更像 Ruby:

{
  :title => i.xpath('title').text,
  :url   => i.xpath('link').text,
  :date  => i.xpath('pubDate').text.to_datetime
} 

还有:

feeds = %w(wordpressfeed1, wordpressfeed2)
docs = feeds.each { |d| Nokogiri::XML(open(d)) }

each 是错误的迭代器。你想要map,它将返回所有解析的DOM,将它们分配给docs

这不会修复 404 错误,这是一个错误的 URL,是一个不同的问题。你没有正确定义你的数组:

%w(wordpressfeed1, wordpressfeed2)

应该是:

%w(wordpressfeed1 wordpressfeed2)

或:

['wordpressfeed1', 'wordpressfeed2']

编辑:

我正在重新访问此页面并注意到:

我需要在页面加载时一次解析大约 50 个 XML 提要。

在处理从其他站点(尤其是其中的 50 个站点)抓取数据时,这完全是错误的处理方式。

WordPress 网站通常有一个新闻(RSS 或 Atom)提要。提要中应该有一个参数说明刷新页面的频率。尊重这个间隔,不要更频繁地访问他们的页面,尤其是当您将负载绑定到 HTML 页面加载或刷新时。

有很多原因,但它分解为“只是不要这样做”,以免你被禁止。如果不出意外,使用网页刷新对您的网站进行 DOS 攻击将是微不足道的,结果会击败他们的网站,而这两者都不是您的优秀网络开发人员。你首先保护自己,他们会继承这一点。

那么,当您想要获得 50 个站点并获得快速响应而又不击败其他站点时,您会怎么做?您将数据缓存在数据库中,然后在加载或刷新页面时从中读取。而且,在后台,您还有另一个任务会定期启动以扫描其他站点,同时尊重它们的刷新率。

【讨论】:

  • 我是否应该每 30 分钟执行一次 cron 作业并保存一个包含所有 50 个提要的 XML 文件。我有无尽的分页..
  • 定义“需要时间”。我认为我的旧笔记本电脑可以在一分钟内完成 50 个站点。而且,如何将其关闭取决于您。我认为每 30 分钟访问一次网站是一种滥用行为,除非您拥有页面和主机。每天一次是正常的间隔,除非站点另有规定。如果您需要并行运行 GET,请查看 Typhoeus 或 Curb,但这会使您的处理和聚合变得复杂。
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
相关资源
最近更新 更多