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

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

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

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

Q&A

解決済

4回答

5184閲覧

PHPスクレイピングで一致した文字列と同一階層のhtmlを取得したい。

shoya.shiraki

総合スコア430

PHP

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

0グッド

0クリップ

投稿2015/11/29 12:49

編集2015/11/29 22:15

$html = file_get_contents($url);
で取得した以下の様な内容のhtmlで、
「タイトル2」の「項目1」を取得したいと考えております。

タイトル2と同じ階層のhtmlを取得する(?)というアプローチで考えておりますが、
最適な方法がわからないため、ご教授頂きたいです。

<tr> <th>タイトル1</th> <td>項目1</td> </tr> <tr> <th>タイトル2</th> <td>項目1</td> </tr> <tr> <th>タイトル3</th> <td>項目1</td> </tr>

追記(11/30):

正規表現やPHP Simple HTML DOM Parserで基本的にはできているのですが、
今回質問させて頂いたケースだけが解決できないという状況です。
考え方の助言だけでもいただけると幸いです。

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

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

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

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

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

guest

回答4

0

ベストアンサー

test.html

html

1<html> 2<body> 3 <table> 4 <tr> 5 <th>タイトル1</th> 6 <td>項目1</td> 7 </tr> 8 <tr> 9 <th>タイトル2</th> 10 <td>項目1</td> 11 </tr> 12 <tr> 13 <th>タイトル3</th> 14 <td>項目1</td> 15 </tr> 16 </table> 17</body> 18</html>

php

1<?php 2require_once 'simple_html_dom.php'; 3 4// test.html読み込み 5$html = file_get_html( 'test.html' ); 6 7foreach ($html->find('tr') as $e) { 8 if($e->find('th',0)->innertext == 'タイトル1'){ 9 echo $e->find('td',0)->innertext; 10 } 11} 12

テキストでの検索ができないのでtrを全てチェックする形になると思います。

投稿2015/11/30 01:45

Kaoru_A

総合スコア124

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

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

shoya.shiraki

2015/12/01 08:45

この方法で実現できました。ありがとうございます!
guest

0

追記部分込みで回答します。
私はjQueryが得意なのでそちらベースで考えますが、
PHPQueryPHP Simple HTML DOM Parserでどの程度解決出来るか調査してみてください。


正規表現<([^<]+)>[^>]*タイトル2で、「タイトル2」を内包している要素が分かるので、
まずはその手前の文字列から「ID、クラス、タグ名」を取得してきます。

それを一度DOMパーサーで検索します。
IDがついてたら当然一意に決まりますが、ついてなければ複数の要素が取れる→配列で帰ってくるはず…

配列を再度文字列検索でタイトル2を内包しているか否かで見ていきます。
文字列検索する前に、タグを検知したら中身を消し飛ばしておきましょう。
※このタイミングで「タイトル2」の要素を掴んだはず

jQueryのparentで親の要素を取得します。
続けてchildrenで兄弟要素の一覧を取得します。
(PHPQueryなら同程度のことは出来そうですが…)

投稿2015/11/29 23:14

miyabi-sun

総合スコア21158

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

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

0

PHPのスクレイピングライブラリではGoutteなどが有名ですね。
PHPのWebスクレイピング・ライブラリ「Goutte」と「phpQuery」を比較してみた - Qiita

ライブラリを利用しない場合だと、以下の記事が参考になるかと思います。
PHPネイティブのDOMによるスクレイピング入門 - Qiita

ライブラリを活用した方がお手軽に実装できるので、そちらがオススメです。

投稿2015/11/29 14:35

massa142

総合スコア169

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

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

0

自力でHTMLをパースするのは中々に大変なので、
ライブラリを使うことをお勧めします。
PHP Simple HTML DOM Parser Manual
参考URL

投稿2015/11/29 13:17

tanat

総合スコア18713

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問