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

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

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1274閲覧

laravel/PHP RSS取得でxml形式のファイルから、複数の記事を取得し、media:contentの情報を取得したい

ink88882

総合スコア24

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/08/12 09:16

編集2019/08/12 09:18

お世話になっております。

googleニュースのRSS形式のxmlファイルから
記事一覧を取り出しておりますが、その中で
media:content というタグのデータがうまく取り出せません。

Laravel Framework 5.8.31
PHP 7.3.6

PHP

1 2(コントローラー側のコード) 3 4$keywords = "天気"; //検索キーワードを使う場合 5$query = urlencode(mb_convert_encoding($keywords,"UTF-8", "auto")); //文字列に変換 6$API_BASE_URL = "https://news.google.com/rss/search?ie=UTF-8&oe=UTF-8&q=".$keywords."&hl=ja&gl=JP&ceid=JP:ja"; //検索キーワードを含めたurl 7 8 9 10//まずは上記のコードでRSSのurlを取得します。 11//全ての記事ではありませんが、いくつかの記事において 12//url、つまり「https://news.google.com/rss/search?ie=UTF-8&oe=UTF-8&q=%E5%A4%A9%E6%B0%97&hl=ja&gl=JP&ceid=JP:ja」を確認すると、 13//「media:content」という、記事のサムネイル画像のurl情報が確認できます。 14 15//つづいて、urlから、foreachで各種記事をページに表示させるため、下記のコードをコントローラーに記載。 16 17 18$items = simplexml_load_file($API_BASE_URL)->channel->item; 19 //記事のタイトルとURL、mediaを取り出して配列に格納 20 for ($i = 0; $i < count($items); $i++) { 21 22 $list[$i]['title'] = mb_convert_encoding($items[$i]->title ,"UTF-8", "auto"); 23 $url_split = explode("=", (string)$items[$i]->link->attributes()->href); 24 $list[$i]['url'] = end($url_split); 25 26 //media:contentがある記事の場合は、そのurlを取得 27 if((string)$items[$i]->children('media', true)->content){ 28 $list[$i]['image_url'] = (string)$items[$i]->children('media', true)->content->attributes()->url; 29 30     //ない場合はサンプル画像にします。 31 }else{ 32 $list[$i]['image_url'] = "適当なサンプル画像url" 33 34} 35 36後略 37

上記をコントローラーで記載し、laravel側のビューで表示させます。

php

1 2前略 3 4@foreach ($items as $item) 5 6 7<h2>{{ $item['title'] }}</h2> 8<a href="{{ $item['url'] }}">ニュースを見る</a><br> 9 10<img src="{{ $list['image_url'] }}" alt=""> 11 12後略 13 14 15@endforeach

上記記述で記載すると、全記事の画像がサンプル画像として表示されてしまいます。
media:contentがある記事の場合も、そのmedia:contentを取得できていないようです。

確認できたこと

・title、urlなどは取得できていますので、コントローラーの流れなどは問題なさそうです。
・$API_BASE_URLを作った後に、テストとして下記のようなコードを書くと正常にmedia:contentのurlは取れています。

php

1 $items = simplexml_load_file($API_BASE_URL)->channel->item; 2 $image_url = (string)$items[数字]->children('media', true)->content->attributes()->url; 3 print_r($image_url); 4 5※上記の「数字」には、3とか、4とかその時点でのRSS、「https://news.google.com/rss/search?ie=UTF-8&oe=UTF-8&q=%E5%A4%A9%E6%B0%97&num=5&hl=ja&gl=JP&ceid=JP:ja」にニュースの配列の番号を入れています(リアルタイムでrssは変わっているので仮に数字しています。)

恐れ入りますが、考えられることがないか、ご確認いただけますと幸いです。

参考記事:https://manablog.org/php_rss_get/
※「サムネイルは以下のように取得できます」を参照

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/12 10:02

どういうxml構造になっているか、似たようなことをしてrss取得しようとしてもそんなmedia:contentが含まれなかったので、サンプルを例示できないでしょうか。
ink88882

2019/08/12 14:00 編集

ご確認ありがとうございます。上記質問記載の、下記urlでご確認いただけるかと思います。 https://news.google.com/rss/search?ie=UTF-8&oe=UTF-8&q= キーワード &hl=ja&gl=JP&ceid=JP:ja 上記のキーワードの箇所に「天気」などを入れアクセスするとxmlをご確認いただけますが、 全てではありませんが、いくつかの記事で 「media:content」という項目があります。
ink88882

2019/08/12 14:01

失礼いたしました、少し修正いたしました。 上記でご確認いただけます。
guest

回答1

0

ベストアンサー

判定を、

php

1if (0 < count($items[$i]->children('media', true)->content)) { 2 ...

にしてはいかがでしょうか。
$items[$i]->children('media', true)->contentSimpleXMLElement のオブジェクトなので、string でキャストしても、期待した結果にならないと思います。

投稿2019/08/16 11:13

raa0121

総合スコア190

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

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

ink88882

2019/08/18 07:18

ありがとうございます。 判定の箇所を調整することでうまくいきました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問