将来自rss feed的web图像集成到Ruby

时间:2014-11-14 20:09:59

标签: ruby xml rss dashing

可能不清楚,但我会尽我所能。 我目前正在使用仪表板设计器(基于sinatra)和RSS小部件。 问题是我无法在每个RSS项目之前获得小图像:

<description>
&lt;img style='vertical-align:middle' src='http://pitre-web.tpg.ch/images?ligne=D' title='Perturbation Line D' alt='Perturbation Line D' /&gt;
&lt;br/&gt;&lt;br/&gt;21:03 - THEME - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</description>

我知道代码看起来有点奇怪但是在网页上所有的东西都被忽略了。 如何将小徽标集成到页面或至少获取行号(这是一条总线 - &gt;这里是D)以便在我的小部件中以纯文本形式集成? 我不知道这是否有帮助,但我使用nogokiri从RSS提要中获取XML。那么我可以用什么来获取这条信息呢?

summary = clean_html( news_item.xpath('description').text )

提前致谢:)

1 个答案:

答案 0 :(得分:1)

<description>标记的内容是HTML编码的,因此需要将其解码回HTML,然后重新解析:

require 'nokogiri'

doc = Nokogiri::XML::DocumentFragment.parse(<<EOT)
<description>
&lt;img style='vertical-align:middle' src='http://pitre-web.tpg.ch/images?ligne=D' title='Perturbation Line D' alt='Perturbation Line D' /&gt;
&lt;br/&gt;&lt;br/&gt;21:03 - THEME - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</description>
EOT

这是找到标签的方法:

description_text = doc.at('description')

要访问其内容,请使用:

description_text = doc.at('description').text 
# => "\n<img style='vertical-align:middle' src='http://pitre-web.tpg.ch/images?ligne=D' title='Perturbation Line D' alt='Perturbation Line D' />\n<br/><br/>21:03 - THEME - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"

对该内容采取措施:

description_doc = Nokogiri::HTML::DocumentFragment.parse(description_text)
description_doc.at('img')['src'] # => "http://pitre-web.tpg.ch/images?ligne=D"

真正的XML与问题中给出的不匹配。这是一个更好的例子,展示了遇到的问题:

<?xml version='1.0' encoding='UTF-8'?>
<rss>
  <channel>
    <title />
    <description />
    <item>
      <description>
&lt;img style='vertical-align:middle' src='http://pitre-web.tpg.ch/images?ligne=2' title='Perturbation Ligne 2' alt='Perturbation Ligne 2' /&gt;
      &lt;br/&gt;&lt;br/&gt;18:47 - Surcharge de trafic - Retard de 8 minutes entre Marbriers et Gen&amp;egrave;ve-Plage.
      </description>
    </item>
    <item>
      <description>
&lt;img style='vertical-align:middle' src='http://pitre-web.tpg.ch/images?ligne=19' title='Perturbation Ligne 19' alt='Perturbation Ligne 19' /&gt;
      &lt;br/&gt;&lt;br/&gt;18:43 - Cimeti&amp;egrave;re Saint-Georges - direction Vernier-Village - Incident &amp;agrave; bord du v&amp;eacute;hicule - Immobilisation du v&amp;eacute;hicule
      </description>
    </item>
    </channel>
</rss>

基于此,这里的代码用于提取URL:

require 'nokogiri'
doc = Nokogiri::XML(open('xml'))
img_srces = doc.search('item description').map{ |description|
  desc_doc = Nokogiri::HTML(description.text)
  desc_doc.at('img')['src']
}
img_srces
# => ["http://pitre-web.tpg.ch/images?ligne=2",
#     "http://pitre-web.tpg.ch/images?ligne=19"]