Ruby on rails - Nokogiri 一次解析多个 XML 源并按日期排序



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

我会以不同的方式写它。

尝试更改 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 提要。

在处理从其他站点(尤其是其中五十个站点)获取数据时,这完全是处理这种情况的错误方法。

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

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

那么,当您想获得五十个站点并且具有快速响应并且不击败其他站点时,您会怎么做?将数据缓存在数据库中,然后在加载或刷新页面时从数据库中读取数据。而且,在后台,您还有另一个任务会定期触发以扫描其他站点,同时遵守其刷新率。

相关内容

  • 没有找到相关文章

最新更新