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

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

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

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

PHP

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

正規表現

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

解決済

【PHP】【switch文】想定外の挙動をするのを解決したいです。【正規表現:条件と違うものが選ばれる事があります】

shimane
shimane

総合スコア98

スクレイピング

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

PHP

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

正規表現

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

1回答

0リアクション

0クリップ

229閲覧

投稿2017/07/18 20:05

【現在の状況】

PHPの勉強を開始して数ヶ月のものです。
現在、ドットインストールと書籍で基礎的な知識と簡単なプログラムの作成が終わりました。

そこで
以前こちらにて教えて頂いた通り
自作で作りたいものを作りながらPHPの勉強をしようと思い「スクレイピング」を使ったサイトを作成中です。


【現在の進捗状況】
PHP+PHPQUERYを使用:
「記事のタイトル」「記事のURL」「投稿日時」「画像・動画の枚数」の取得が完了
上記で取得した情報をmysqlに登録
bootstrapを利用して作成したテーブルにmysqlのデータを表示

ここまでなんとか作る事が出来ました。


【問題が発生している点】
次に記事の「引用元」を取得し、取得した「URL」によって「引用元の名前」を取得したいと考えています。

foreach文の中で取得したURLが「引用元」なのか「画像や動画のurl」なのかの判断と
もしも「引用元」だった場合に「引用元の企業名」を変数に入れて
mysqlにて保存していきたいと思っています。

初心者なりにネットで検索したり色々と頭を悩ませた結果、
switch文の条件分岐で書いていけばいいのでは?と考え
switchと正規表現で作ってみました。

PHP

// 引用元のURLを取得(本文中の「a」タグを含めたURLのテキストを取得しています。):phpquery使用 $inyoumoto = pq($entry)->find('dd > a')->text(); switch(true) { case preg_match('/this.kiji.is/', $inyoumoto): $inyoumoto2 = "共同通信"; break; case preg_match('/news.livedoor/', $inyoumoto): $inyoumoto2 = "livedoorニュース"; break; case preg_match('/afpbb/', $inyoumoto): $inyoumoto2 = "AFPBBニュース"; break; case preg_match('/3.nhk.or.jp/', $inyoumoto): $inyoumoto2 = "NHKニュースWEB"; break; case preg_match('/news24.jp/', $inyoumoto): $inyoumoto2 = "日テレNEWS24"; break; case preg_match('/j-cast.com/', $inyoumoto): $inyoumoto2 = "JCASTニュース"; break; case preg_match('/mess-y.com/', $inyoumoto): $inyoumoto2 = "メッシー"; break; case preg_match('/reuters.com/', $inyoumoto): $inyoumoto2 = "ロイター"; break; case preg_match('/news.tv-asahi.co.jp/', $inyoumoto): $inyoumoto2 = "テレビ朝日"; break; case preg_match('/dot.asahi.com/', $inyoumoto): $inyoumoto2 = "AERAdot."; break; case preg_match('/www.sankei.com/', $inyoumoto): $inyoumoto2 = "産経新聞"; break; case preg_match('/headlines.yahoo.co.jp/', $inyoumoto): $inyoumoto2 = "yahooニュース"; break; case preg_match('/www.fnn-news.com/', $inyoumoto): $inyoumoto2 = "FNNニュース"; break; default: $inyoumoto2 = "未登録の引用元です。"; break; }

このコードを利用した所
「8割」ぐらいは条件通りに動いてくれたのですが
たまに
「未登録の引用元」なのに「共同通信」や「産経新聞」と表示されたり
「登録されている引用元」なのに「別の引用元」の名前が表示されたりといった事も発生しています。
(普段は「未登録の引用元」だと正常に表示されるのですが、たまに「別の引用元の企業名」が表示されます。)

なんとか解決出来ないかと2日間ぐらい頭を沸騰させながら悩み続けたのですが上手くいきません。

勉強中の初心者が作ったコードなので
どこかが間違っているのだとは思うですが中々見つける事が出来ません。
どこか変な場所等がありましたら教えて頂けると嬉しいです。

【悩んでいる時に特に参考にしたサイト】

正規表現
http://php.o0o0.jp/article/3179155697556829

switch文
http://qiita.com/tkykmw/items/ee0ab7bf502361f413d8

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

スクレイピング

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

PHP

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

正規表現

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