質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

3回答

1416閲覧

本文中の画像URLを取り出したいです。

jack_kanzaki

総合スコア106

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/05/13 12:03

編集2020/05/16 04:27

nokogiriで画像を抽出したところ、headの画像を中心に取り出してきてしまいます。
そこで、extractcontent.rbで画像を取り出そうと考えたのですが、imgタグを取り出せずに苦しんでいます。slackのようにURLを入力し、本文の画像を取り出すにはどのようにしたらよろしいでしょうか。
どなたか、詳しい方いらっしゃいましたら、よろしくお願いします。

extractcontent.rbを学ぶための良い教材を知っている方がいらっしゃいましたら、そちらでも結構です。どうぞよろしくお願いします。

追記

こちらのサイトの本文画像を取り出そうと考えています。

以下、不完全ですが、私が考えたコードです。

url = "サイト" charset = nil html = crawling(url) doc = Nokogiri::HTML.parse(html, nil, charset) image_url = doc.search('img')[数字].attribute('src').value #相対パスへの対応 url_split = url.split("/") image_url = "#{url_split[0]}/#{image_url}" unless url_split[0].match(/http.*/)

よろしくお願いします!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yasumichi

2020/05/13 13:23

nokogiri の方が良さそうな気がしますが、nokogiri で書いたソースを提示してみたらいかがですか?
guest

回答3

0

画像のURLを大量に抽出するにはOctoparseが役に立つかもしれません。
詳しくは以下の記事をご参照ください。
https://www.octoparse.jp/blog/bulk-download-images-from-links-top-5-bulk-image-downloaders/

投稿2020/05/18 07:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jack_kanzaki

2020/05/18 11:29

ご回答ありがとうございます。 octoparseのアルゴリズムの程を知りたいです。 お教えいただけると幸いです。
退会済みユーザー

退会済みユーザー

2020/05/19 01:43

Octoparseは機械学習を活用して、HTMLを認識ことができます。ですから、画像のURLのIMGタグやsrc属性を識別したら、簡単に抽出できます。 また、ワークフローを作成、人間のように機能します。
guest

0

追記のサイトにおける解答です。
サイト

     url = "サイト" charset = nil html = crawling(url) doc = Nokogiri::HTML.parse(html, nil, charset) images = doc.search('img')[4].attribute('srcset') reg = / /.match("#{images}") p reg.pre_match

汎用的なスクレイピング方法に関しては、解答をお待ちしております。
よろしくお願いします。

投稿2020/05/16 05:42

jack_kanzaki

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

nokogiri の例ですが、以下のようにすれば、すべての <img> タグを取り出せると思います。

ruby

1require 'open-uri' 2require 'nokogiri' 3 4# URL 5url = 'ここを取得したい URL に書き換える。' 6 7# 文字コード 8charset = nil 9 10# HTML 取得 11html = open(url) do |f| 12 charset = f.charset 13 f.read 14end 15 16# HTML の解析 17doc = Nokogiri::HTML.parse(html, nil, charset) 18 19# img タグを処理 20doc.search('img').each do |element| 21 imgsrc = element.attributes['src'] 22 # ここで imgsrc を処理する 23end

doc.search('body img') などと書けば、body の子要素に絞り込めると思います。

【参考リンク】

投稿2020/05/13 13:56

Yasumichi

総合スコア1773

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yasumichi

2020/05/14 11:54

それがですね、次のサイトによると素の状態だと body の html は除去されてしまうようなのです。 ウェブサイトやブログ記事中の本文を抽出するgem - PIYO - Tech & Life - https://blog.piyo.tech/posts/2014-03-08-204704/ 「本文中の画像」の認識が共有できれば、お力になれそうな気がするんですが。
jack_kanzaki

2020/05/15 15:16

ブログや記事の本文に付けられた写真のことです!
jack_kanzaki

2020/05/15 15:18

最もです。extractcontent.rbのgemを利用すると、include_tag: falseにしても本文のhtmlのみ抽出する形になってしまいます。
jack_kanzaki

2020/05/15 15:19

ご回答ありがとうございます。 Yasumichiさんのお力をお貸しいただければ、大変心強いです!!
Yasumichi

2020/05/15 15:35

サイトによって、本文部分の表現方法(class名)が違う気がするのですが、class 名の当たりはついていますか。あるいは、特定の CMS など、ターゲットは決まっていますか? なかなか、汎用的に作るのが難しいと思うのです。
jack_kanzaki

2020/05/16 03:04

extract contentは汎用的に作るモジュールだと思うので、そのモジュールをうまく使えればと思っております。
jack_kanzaki

2020/05/16 03:19

引き続きよろしくお願いします!!
Yasumichi

2020/05/16 03:22

まず、どこが本文と認識させるか、そこを考えた方が良さそうです。 とりあえず、汎用的にするのは後回しにして、具体的なターゲットを絞ってやってみましょう。 まず、ここのサイトをターゲットにしたいというのはありますか?
jack_kanzaki

2020/05/16 04:28

yasumichiさんの書き方でも再検討します!
Yasumichi

2020/05/16 04:38

上記サイトの例ですと <article class="article-detail"> が本文部分のコンテナーになっているので上記ソースで doc.search('img').each を doc.search('article.article-detail img').each に変更すれば、ほぼ、目的の URL が抽出できます。 # まだ、余分なものが出てくるのでどうやって除外するかは検討する必要がありますが。
jack_kanzaki

2020/05/16 05:37 編集

ご回答ありがとうございます。
jack_kanzaki

2020/05/16 05:38

このサイトに関する解答は解答例として、投稿します。 これを他のサイトで汎用的にするにはどのようにするのがベストであるとyasumichiさんはお考えになりますか?
Yasumichi

2020/05/16 05:41

パターンをある程度、収集して、共通化できる方法を考えますかね。 あとは、特定のエレメントを持っているかで分岐して、処理していくような感じす。
jack_kanzaki

2020/05/16 05:45

なるほどです。 サイトによって(今回の場合はこちら 上記サイトの例ですと <article class="article-detail"> が本文部分のコンテナーになっているので上記ソースで doc.search('img').each を doc.search('article.article-detail img').each に変更すれば、ほぼ、目的の URL が抽出できます。 ) が肝になってくるのですね。 やはり要素をそのままとってくることを汎用化するのは難しいですか。 (特に、slackがいかにそれをやっているのかが気になります。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問