teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

nokogiriのみでパース

2015/02/23 11:07

投稿

riocampos
riocampos

スコア241

answer CHANGED
@@ -37,4 +37,18 @@
37
37
 
38
38
  > `<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">`
39
39
 
40
- この例ぐらいならば正規表現でも抜き出せますが、複雑になってくると大変です。なので、 nokogiri などの XML/HTML パーサを使いましょう。
40
+ この例ぐらいならば正規表現でも抜き出せますが、複雑になってくると大変です。なので、 nokogiri などの XML/HTML パーサを使いましょう。
41
+
42
+ # 別解: nokogiri だけで抜き出してみる
43
+
44
+ ```lang-ruby
45
+ require 'nokogiri'
46
+ require 'open-uri'
47
+
48
+ doc = Nokogiri::XML.parse(open("http://www.webcreatorbox.com/feed/").read)
49
+ doc.xpath('//channel/item').map do |item|
50
+ Nokogiri::HTML.parse(item.xpath('description').text).css('img').to_html
51
+ end
52
+ ```
53
+
54
+ Atom や RSS は XML なので nokogiri でパース出来ます。

3

末尾追記

2015/02/23 11:07

投稿

riocampos
riocampos

スコア241

answer CHANGED
@@ -27,7 +27,7 @@
27
27
 
28
28
  です。
29
29
  ここから HTML である img タグを切り取ります。
30
- HTML や XML をパースするのなら…やはり nokogiri ですね。 feedjira は nokogiri に依存しているので、 `require 'feedjira'` すれば nokogiri も使えるようになります。
30
+ **HTML や XML をパースするのなら…やはり nokogiri ですね** 。 feedjira は nokogiri に依存しているので、 `require 'feedjira'` すれば nokogiri も使えるようになります。
31
31
  feed.entries[0].summary は String なので、そのまま Nokogiri::HTML.parse でぶった切ります。
32
32
  で `css('img')` で img タグ部分を抜き取ります。(普段は XPath ばかり使うので当初は `xpath('//img')` と書いていたのですが、 css のほうがシンプルになっていたので書き直しました。)
33
33
 
@@ -36,3 +36,5 @@
36
36
  これを `to_html` で HTML に戻します。
37
37
 
38
38
  > `<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">`
39
+
40
+ この例ぐらいならば正規表現でも抜き出せますが、複雑になってくると大変です。なので、 nokogiri などの XML/HTML パーサを使いましょう。

2

回答追記

2015/02/23 08:54

投稿

riocampos
riocampos

スコア241

answer CHANGED
@@ -1,1 +1,38 @@
1
- 具体的なフィード(のURL)を上げてくださればお答えできるかもしれません。
1
+ 具体的なフィード(のURL)を上げてくださればお答えできるかもしれません。
2
+ ---
3
+
4
+ > 例えばWebクリエイターボックスさんのようなブログです。
5
+ > http://www.webcreatorbox.com/feed/
6
+
7
+ とのことなのでこれを料理してみましょう。
8
+
9
+ feedjira を使うのは初めてなので、取得の仕方が下手だったらゴメンナサイね。
10
+
11
+ ```lang-ruby
12
+ require 'feedjira'
13
+
14
+ feed = Feedjira::Feed.fetch_and_parse("http://www.webcreatorbox.com/feed/")
15
+ img_tags = feed.entries.map do |entry|
16
+ Nokogiri::HTML.parse(entry.summary).css('img').to_html
17
+ end
18
+ ```
19
+
20
+ これで各エントリの img タグのみの配列が取得出来ました。
21
+
22
+ # 解説
23
+
24
+ Atom の各エントリの summary (XML 的には <description> タグ)を取得します。いま(2/23 17時半)だと一つ目( feed.entries[0].summary )は
25
+
26
+ > `<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;]`
27
+
28
+ です。
29
+ ここから HTML である img タグを切り取ります。
30
+ HTML や XML をパースするのなら…やはり nokogiri ですね。 feedjira は nokogiri に依存しているので、 `require 'feedjira'` すれば nokogiri も使えるようになります。
31
+ feed.entries[0].summary は String なので、そのまま Nokogiri::HTML.parse でぶった切ります。
32
+ で `css('img')` で img タグ部分を抜き取ります。(普段は XPath ばかり使うので当初は `xpath('//img')` と書いていたのですが、 css のほうがシンプルになっていたので書き直しました。)
33
+
34
+ > `[#<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">]>]`
35
+
36
+ これを `to_html` で HTML に戻します。
37
+
38
+ > `<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

追記

2015/02/23 08:50

投稿

riocampos
riocampos

スコア241

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