回答編集履歴

4 nokogiriのみでパース

riocampos

riocampos score 268

2015/02/23 20:07  投稿

具体的なフィード(のURL)を上げてくださればお答えできるかもしれません。
---
> 例えばWebクリエイターボックスさんのようなブログです。
> http://www.webcreatorbox.com/feed/
とのことなのでこれを料理してみましょう。
feedjira を使うのは初めてなので、取得の仕方が下手だったらゴメンナサイね。
```lang-ruby
require 'feedjira'
feed = Feedjira::Feed.fetch_and_parse("http://www.webcreatorbox.com/feed/")
img_tags = feed.entries.map do |entry|
 Nokogiri::HTML.parse(entry.summary).css('img').to_html
end
```
これで各エントリの img タグのみの配列が取得出来ました。
# 解説
Atom の各エントリの summary (XML 的には <description> タグ)を取得します。いま(2/23 17時半)だと一つ目( feed.entries[0].summary )は
> `<img width="773" height="406" src="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg" class="attachment-thumbnail wp-post-image" alt="thumb_ano" />WebクリエイターボックスのTwitter: @webcreatorboxでは毎日Webに関する記事や美しいデザイン・写真などを紹介しています。その中で今週人気だったつぶやきトップ10を紹介します。見逃してしまった人はこ [&#8230;]`
です。
ここから HTML である img タグを切り取ります。
**HTML や XML をパースするのなら…やはり nokogiri ですね** 。 feedjira は nokogiri に依存しているので、 `require 'feedjira'` すれば nokogiri も使えるようになります。
feed.entries[0].summary は String なので、そのまま Nokogiri::HTML.parse でぶった切ります。
で `css('img')` で img タグ部分を抜き取ります。(普段は XPath ばかり使うので当初は `xpath('//img')` と書いていたのですが、 css のほうがシンプルになっていたので書き直しました。)
> `[#<Nokogiri::XML::Element:0x3fd35040e648 name="img" attributes=[#<Nokogiri::XML::Attr:0x3fd350415ca4 name="width" value="773">, #<Nokogiri::XML::Attr:0x3fd350415c90 name="height" value="406">, #<Nokogiri::XML::Attr:0x3fd350415c7c name="src" value="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg">, #<Nokogiri::XML::Attr:0x3fd350415c54 name="class" value="attachment-thumbnail wp-post-image">, #<Nokogiri::XML::Attr:0x3fd350415c40 name="alt" value="thumb_ano">]>]`
これを `to_html` で HTML に戻します。
> `<img width="773" height="406" src="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg" class="attachment-thumbnail wp-post-image" alt="thumb_ano">`
この例ぐらいならば正規表現でも抜き出せますが、複雑になってくると大変です。なので、 nokogiri などの XML/HTML パーサを使いましょう。
この例ぐらいならば正規表現でも抜き出せますが、複雑になってくると大変です。なので、 nokogiri などの XML/HTML パーサを使いましょう。
# 別解: nokogiri だけで抜き出してみる
```lang-ruby
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::XML.parse(open("http://www.webcreatorbox.com/feed/").read)
doc.xpath('//channel/item').map do |item|
 Nokogiri::HTML.parse(item.xpath('description').text).css('img').to_html
end
```
Atom や RSS は XML なので nokogiri でパース出来ます。
3 末尾追記

riocampos

riocampos score 268

2015/02/23 17:54  投稿

具体的なフィード(のURL)を上げてくださればお答えできるかもしれません。
---
> 例えばWebクリエイターボックスさんのようなブログです。
> http://www.webcreatorbox.com/feed/
とのことなのでこれを料理してみましょう。
feedjira を使うのは初めてなので、取得の仕方が下手だったらゴメンナサイね。
```lang-ruby
require 'feedjira'
feed = Feedjira::Feed.fetch_and_parse("http://www.webcreatorbox.com/feed/")
img_tags = feed.entries.map do |entry|
 Nokogiri::HTML.parse(entry.summary).css('img').to_html
end
```
これで各エントリの img タグのみの配列が取得出来ました。
# 解説
Atom の各エントリの summary (XML 的には <description> タグ)を取得します。いま(2/23 17時半)だと一つ目( feed.entries[0].summary )は
> `<img width="773" height="406" src="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg" class="attachment-thumbnail wp-post-image" alt="thumb_ano" />WebクリエイターボックスのTwitter: @webcreatorboxでは毎日Webに関する記事や美しいデザイン・写真などを紹介しています。その中で今週人気だったつぶやきトップ10を紹介します。見逃してしまった人はこ [&#8230;]`
です。
ここから HTML である img タグを切り取ります。
HTML や XML をパースするのなら…やはり nokogiri ですね。 feedjira は nokogiri に依存しているので、 `require 'feedjira'` すれば nokogiri も使えるようになります。
**HTML や XML をパースするのなら…やはり nokogiri ですね** 。 feedjira は nokogiri に依存しているので、 `require 'feedjira'` すれば nokogiri も使えるようになります。
feed.entries[0].summary は String なので、そのまま Nokogiri::HTML.parse でぶった切ります。
で `css('img')` で img タグ部分を抜き取ります。(普段は XPath ばかり使うので当初は `xpath('//img')` と書いていたのですが、 css のほうがシンプルになっていたので書き直しました。)
> `[#<Nokogiri::XML::Element:0x3fd35040e648 name="img" attributes=[#<Nokogiri::XML::Attr:0x3fd350415ca4 name="width" value="773">, #<Nokogiri::XML::Attr:0x3fd350415c90 name="height" value="406">, #<Nokogiri::XML::Attr:0x3fd350415c7c name="src" value="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg">, #<Nokogiri::XML::Attr:0x3fd350415c54 name="class" value="attachment-thumbnail wp-post-image">, #<Nokogiri::XML::Attr:0x3fd350415c40 name="alt" value="thumb_ano">]>]`
これを `to_html` で HTML に戻します。
> `<img width="773" height="406" src="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg" class="attachment-thumbnail wp-post-image" alt="thumb_ano">`
この例ぐらいならば正規表現でも抜き出せますが、複雑になってくると大変です。なので、 nokogiri などの XML/HTML パーサを使いましょう。
2 回答追記

riocampos

riocampos score 268

2015/02/23 17:50  投稿

具体的なフィード(のURL)を上げてくださればお答えできるかもしれません。
具体的なフィード(のURL)を上げてくださればお答えできるかもしれません。
---
> 例えばWebクリエイターボックスさんのようなブログです。
> http://www.webcreatorbox.com/feed/
とのことなのでこれを料理してみましょう。
feedjira を使うのは初めてなので、取得の仕方が下手だったらゴメンナサイね。
```lang-ruby
require 'feedjira'
feed = Feedjira::Feed.fetch_and_parse("http://www.webcreatorbox.com/feed/")
img_tags = feed.entries.map do |entry|
 Nokogiri::HTML.parse(entry.summary).css('img').to_html
end
```
これで各エントリの img タグのみの配列が取得出来ました。
# 解説
Atom の各エントリの summary (XML 的には <description> タグ)を取得します。いま(2/23 17時半)だと一つ目( feed.entries[0].summary )は
> `<img width="773" height="406" src="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg" class="attachment-thumbnail wp-post-image" alt="thumb_ano" />WebクリエイターボックスのTwitter: @webcreatorboxでは毎日Webに関する記事や美しいデザイン・写真などを紹介しています。その中で今週人気だったつぶやきトップ10を紹介します。見逃してしまった人はこ [&#8230;]`
です。
ここから HTML である img タグを切り取ります。
HTML や XML をパースするのなら…やはり nokogiri ですね。 feedjira は nokogiri に依存しているので、 `require 'feedjira'` すれば nokogiri も使えるようになります。
feed.entries[0].summary は String なので、そのまま Nokogiri::HTML.parse でぶった切ります。
で `css('img')` で img タグ部分を抜き取ります。(普段は XPath ばかり使うので当初は `xpath('//img')` と書いていたのですが、 css のほうがシンプルになっていたので書き直しました。)
> `[#<Nokogiri::XML::Element:0x3fd35040e648 name="img" attributes=[#<Nokogiri::XML::Attr:0x3fd350415ca4 name="width" value="773">, #<Nokogiri::XML::Attr:0x3fd350415c90 name="height" value="406">, #<Nokogiri::XML::Attr:0x3fd350415c7c name="src" value="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg">, #<Nokogiri::XML::Attr:0x3fd350415c54 name="class" value="attachment-thumbnail wp-post-image">, #<Nokogiri::XML::Attr:0x3fd350415c40 name="alt" value="thumb_ano">]>]`
これを `to_html` で HTML に戻します。
> `<img width="773" height="406" src="http://www.webcreatorbox.com/wp-content/uploads/2015/02/thumb_ano.jpg" class="attachment-thumbnail wp-post-image" alt="thumb_ano">`
1 追記

riocampos

riocampos score 268

2015/02/23 17:09  投稿

具体的なフィードを上げてくださればお答えできるかもしれません。
具体的なフィード(のURL)を上げてくださればお答えできるかもしれません。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る