0

我正在使用 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 提要。

4

1 回答 1

3

我会用不同的方式来写。

尝试更改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 个站点并具有快速响应而不击败其他站点时,您会怎么做?您将数据缓存在数据库中,然后在加载或刷新页面时从中读取。而且,在后台,您还有另一个任务会定期启动以扫描其他站点,同时尊重它们的刷新率。

于 2013-01-23T00:46:56.470 回答