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

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

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

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

PHP

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

Q&A

解決済

1回答

1235閲覧

PHPQuery h4とaタグをセットで取得したい

syo_prog

総合スコア2

スクレイピング

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

PHP

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

0グッド

0クリップ

投稿2021/09/20 06:33

編集2021/09/20 13:11

PHPQueryでスクレイピングをはじめたものです。
あることで躓いたので質問させて頂きました。

前提・実現したいこと

html

1<div> 2 <h4 class="title">1</h4> 3 <div class="link-select"> 4 <ul> 5 <li><a href="?l=1-1">1番</a></li> 6 <li><a href="?l=1-2">2番</a></li> 7 </ul> 8 </div> 9 10 <h4 class="title">2</h4> 11 <div class="link-select"> 12 <ul> 13 <li><a href="?l=2-1">1番</a></li> 14 <li><a href="?l=2-2">2番</a></li> 15 </ul> 16 17 <h4 class="title">3</h4> 18 <div class="link-select"> 19 <ul> 20 <li><a href="?l=3-1">1番</a></li> 21 <li><a href="?l=3-2">2番</a></li> 22 <li><a href="?l=3-3">3番</a></li> 23 </ul> 24 25 <h4 class="title">4</h4> 26 <div class="link-select"> 27 <ul> 28 <li><a href="?l=4-1">1番</a></li> 29 </ul> 30 </div> 31</div>

上のようなHTMLの「h4(.title)」と「href(a)」をまとめて、配列にしたいです。

ソースコード

php

1<?php 2require_once("phpQuery-onefile.php"); 3$html = file_get_contents("1.html"); 4$doc = phpQuery::newDocument($html); 5 6// ここから先が分からないため質問させていただきました。

実現したいこと

実行結果(array)

array ( '1' => '1番','?l=1-1','2番','?l=1-2' '2' => '1番','?l=2-1','2番','?l=2-2' '3' => '1番','?l=3-1','2番','?l=3-2','3番','?l=3-3' '4' => '1番','?l=4-1' )

「①」と「aタグのhref」をセットにして配列を作りたいです。

補足情報(FW/ツールのバージョンなど)

Windows10 Home
xampp v3.2.4

その他

質問内容に不備や、分からないことがありましたらコメントお願いいたします。追記などさせていただきます。

追記

2021/09/20 22:10
以下のように作成してみました。
(1-1, 1-2, 2-1 などのようにわかりやすくしていますが、実際は規則性のない文字列になっています。)
「.title」「aタグの文字,href」を配列にする事はできていますが、実現したい事のようにまとめることができていません。

php

1<?php 2require_once("phpQuery-onefile.php"); 3$html = file_get_contents("1.html"); 4$doc = phpQuery::newDocument($html); 5 6 7// .title 8$titles = $doc->find(".title"); 9foreach($titles as $title){ 10 $title_l[] = pq($title)->text(); 11} 12var_dump($title_l); 13// array(4) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" } 14 15// a 16$links = $doc->find("a"); 17foreach($links as $link){ 18 $link_l[] = pq($link)->text(); 19 $link_h_l[] = pq($link)->attr("href"); 20} 21var_dump($link_l); 22// array(8) { [0]=> string(6) "1番" [1]=> string(6) "2番" [2]=> string(6) "1番" [3]=> string(6) "2番" [4]=> string(6) "1番" [5]=> string(6) "2番" [6]=> string(6) "3番" [7]=> string(6) "1番" } 23var_dump($link_h_l); 24// array(8) { [0]=> string(6) "?l=1-1" [1]=> string(6) "?l=1-2" [2]=> string(6) "?l=2-1" [3]=> string(6) "?l=2-2" [4]=> string(6) "?l=3-1" [5]=> string(6) "?l=3-2" [6]=> string(6) "?l=3-3" [7]=> string(6) "?l=4-1" }

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

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

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

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

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

m.ts10806

2021/09/20 08:08

現状だとほぼ何も書いてない状態なので作業依頼と変わらないかと思います。 まず1つずつ取り出してみるところからでは?
syo_prog

2021/09/20 13:11

申し訳ございません。 先ほど追記いたしました。 「.title」・「aタグの文字」・「aタグのhref」を別々に配列にする事はできていますが、 .title「1」に何個のaタグがあるかなどがわからないため、まとめることができていません。 アドバイス等いただければと思います。
m.ts10806

2021/09/20 21:11

セレクタのはずなのでJavaScriptの理論で $doc->find(".title a"); とかで「配下のa」が取れませんか?
syo_prog

2021/09/21 13:27

「.title a」では取得できませんでした。
guest

回答1

0

ベストアンサー

タイトルとリンクをセットとして配列で抽出する、という用途でしたら下記のようなコードで実現可能かと思います。
div.link-select.titleの配下ではなく、同一階層の次の項目であるためnextメソッドで抽出する必要があります。

なお、質問に記載のhtmlですとdivタグが閉じられていない部分がありますので正常には動作しません。

php

1<?php 2 3require_once("phpQuery-onefile.php"); 4$html = <<<EOT 5<div> 6 <h4 class="title">1</h4> 7 <div class="link-select"> 8 <ul> 9 <li><a href="?l=1-1">1番</a></li> 10 <li><a href="?l=1-2">2番</a></li> 11 </ul> 12 </div> 13 14 <h4 class="title">2</h4> 15 <div class="link-select"> 16 <ul> 17 <li><a href="?l=2-1">1番</a></li> 18 <li><a href="?l=2-2">2番</a></li> 19 </ul> 20 </div> 21 22 <h4 class="title">3</h4> 23 <div class="link-select"> 24 <ul> 25 <li><a href="?l=3-1">1番</a></li> 26 <li><a href="?l=3-2">2番</a></li> 27 <li><a href="?l=3-3">3番</a></li> 28 </ul> 29 </div> 30 31 <h4 class="title">4</h4> 32 <div class="link-select"> 33 <ul> 34 <li><a href="?l=4-1">1番</a></li> 35 </ul> 36 </div> 37</div> 38EOT; 39$doc = phpQuery::newDocument($html); 40 41$results = []; 42$titles = $doc->find(".title"); 43foreach ($titles as $title) { 44 $title_text = $title->nodeValue; 45 46 $a_data = []; 47 $a_tags = pq($title)->next('.link-select')->find('a'); 48 foreach ($a_tags as $a) { 49 $a_text = $a->nodeValue; 50 $a_href = $a->getAttribute('href'); 51 $a_data[] = [ 52 'text' => $a_text, 53 'href' => $a_href, 54 ]; 55 } 56 $results[$title_text] = $a_data; 57} 58 59print_r($results);

出力結果

Array ( [1] => Array ( [0] => Array ( [text] => 1番 [href] => ?l=1-1 ) [1] => Array ( [text] => 2番 [href] => ?l=1-2 ) ) [2] => Array ( [0] => Array ( [text] => 1番 [href] => ?l=2-1 ) [1] => Array ( [text] => 2番 [href] => ?l=2-2 ) ) [3] => Array ( [0] => Array ( [text] => 1番 [href] => ?l=3-1 ) [1] => Array ( [text] => 2番 [href] => ?l=3-2 ) [2] => Array ( [text] => 3番 [href] => ?l=3-3 ) ) [4] => Array ( [0] => Array ( [text] => 1番 [href] => ?l=4-1 ) ) )

投稿2021/09/25 09:40

Eggpan

総合スコア3257

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

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

Eggpan

2021/09/25 09:42

もうメンテナンスされてないライブラリですし、PHP8.0ではエラーが出て動かなかったので、このライブラリの使用はおすすめ出来ません。 https://github.com/symfony/dom-crawler とか使ったほうが良いと思います
syo_prog

2021/09/25 15:38

回答頂いた方法で試したところ、きちんと動きました。 ご回答ありがとうございました。 別のライブラリの使用も検討します。 この度はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問