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

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

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

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

Q&A

解決済

2回答

3403閲覧

【PHP】同時に複数の仕様のスクレイピングをしたい

tajix_japan

総合スコア132

PHP

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

0グッド

0クリップ

投稿2016/12/28 03:25

編集2016/12/28 06:07

goutte.pharというライブラリを使いスクレイピングを考えています。

goutte.pharを使うと、下記のように書くだけで

http://www.example.com/form.php のボタンBtn1を押し、そこで表示された中から、<table name="small">にあるtdの各々のテキストを順番に全て取得可能です。

<?php require_once 'goutte.phar'; $client = new \Goutte\Client(); // まずフォームのあるURLにアクセス $crawler = $client->request('GET', 'http://www.example.com/form.php''); // 「Btn1」というボタンクリックで送信されるフォームを選択 $form = $crawler->selectButton('Btn1')->form(); $crawler = $client->submit($form, array()); $crawler->filter("table.small td")->each(function ($node){ echo $node->text(); // プレーンテキストを取得 }); ?>

【取得結果】
105-0004 東京都港区新橋1-2-3
105-0004 東京都港区新橋2-3-4
105-0004 東京都港区新橋4-5-6
105-0006 東京都港区芝1-23-3
105-0007 東京都港区芝5-20-1

また、下記のようにすると<table name="small">にあるaタグのついたテキストとURLの取得が可能です。

<?php require_once 'goutte.phar'; $client = new \Goutte\Client(); // まずフォームのあるURLにアクセス $crawler = $client->request('GET', 'http://www.example.com/form.php''); // 「Btn1」というボタンクリックで送信されるフォームを選択 $form = $crawler->selectButton('Btn1')->form(); $crawler = $client->submit($form, array()); $crawler->filter("table.small a")->each(function ($node){ echo $node->attr('href'); // attr->('attribute') //URL取得 }); ?>

【取得結果】
http://www.example.com/page1234.html
http://www.example.com/page1236.html
http://www.example.com/page1366.html
http://www.example.com/page1436.html
http://www.example.com/page1730.html

【やりたいこと】
aタグのついたURLとtd属性の文字を同時に取得したいです。別々に表示されるのではなく下記のようにそれぞれが対で表示されることが望ましいです。

http://www.example.com/page1234.html 105-0004 東京都港区新橋1-2-3
http://www.example.com/page1236.html 105-0004 東京都港区新橋2-3-4
http://www.example.com/page1366.html 105-0004 東京都港区新橋4-5-6
http://www.example.com/page1436.html 105-0006 東京都港区芝1-23-3
http://www.example.com/page1730.html 105-0007 東京都港区芝5-20-1

【試したこと】

<?php require_once 'goutte.phar'; $client = new \Goutte\Client(); // まずフォームのあるURLにアクセス $crawler = $client->request('GET', 'http://www.example.com/form.php''); // 「Btn1」というボタンクリックで送信されるフォームを選択 $form = $crawler->selectButton('Btn1')->form(); $crawler = $client->submit($form, array()); $URL = $crawler->filter("table.small a")->each(function ($node){ echo $node->attr('href'); // attr->('attribute') //URL取得 } $ADDRESS = $crawler->filter("table.small td")->each(function ($node){ echo $node->text(); // プレーンテキストを取得 }); ?>

としてみたのですが、取れませんでした。
$crawler->filter("table.small a")->each(function ($node)あたりの記載方法を変えればよさそうと思っているのですが、いろいろ試しましたがうまくいきません。
どのように記載すれば両方を取得できるのか教えてください。

よろしくお願いいたします。

追記
有難うございます。
テーブルは下記となります。
name="small" ではなく class="small" でした。大変失礼いたしました。

<table class="small"> <tr> <td class="center "> <a id="link" name="link" href="example.com/page1234.html">105-0003</a> </td> <td class="left " > <div class="add">東京都港区新橋1-2-3</div> </td> </tr> <tr> <td class="center "> <a id="link" name="link" href="example.com/page1299.html">105-0004</a> </td> <td class="left " > <div class="add">東京都港区新橋5-6-7</div> </td> </tr> </table>

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

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

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

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

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

popobot

2016/12/28 05:36 編集

<table name="small">ないのtdとaがどのような構造なのか知りたいです。できればHTMLのサンプルとか載せてください。
tajix_japan

2016/12/28 06:08

有難うございます。テーブルを追記してみました。よろしくお願いいたします。
guest

回答2

0

まず、回答ではないのですが、少し気になりましたので。。。

スクレイピングの開発を行うのであれば、
・まず自分のスクリプトをローカルテストする環境を手元に構築して下さい。
・スクレイピング先のサイトポリシーに違反していないか確認して下さい。
・スクレイピングにライブラリーを使用するのであれば、その挙動を理解して下さい。

今の質問の状況を見る限り、いずれも出来ていないと思います。
スクレイピングは、他の技術と違って、相手先のサイトに迷惑をかける可能性のある技術です。
十分な技術と、ローカルテストが必要です。

まずは、対象となるソースをローカルに保存し、それをどのように操作すれば、意図した挙動となるか確認できるようになりましょう。開発はそれからです。

今回の件、表示の話であれば、すでにオブジェクトは作られているので、単純に表現方法を考えれば良いです。
デバッグでもかけて、$node の中身を確認し、どう表現すれば良いか、組み立てれば完成です。
ちなみに<td>の抜き出しを私がやるのであれば、そもそもライブラリは使用せず、正規表現で抜き出します。

再度になりますが、スクレイピングは相手のサイトに負荷をかける技術であることを認識して、実行して下さい。

投稿2016/12/28 04:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

以下のように一旦trでeachしてそれぞれを配列に入れて返すのはどうでしょうか

php

1use Symfony\Component\DomCrawler\Crawler; 2 3$html = ' 4<table class="small"> 5<tr> 6<td class="center "> 7<a id="link" name="link" href="example.com/page1234.html">105-0003</a> 8</td> 9<td class="left " > 10<div class="add">東京都港区新橋1-2-3</div> 11</td> 12</tr> 13<tr> 14<td class="center "> 15<a id="link" name="link" href="example.com/page1299.html">105-0004</a> 16</td> 17<td class="left " > 18<div class="add">東京都港区新橋5-6-7</div> 19</td> 20</tr> 21</table> 22'; 23$crawler = new Crawler(); 24$crawler->addHtmlContent($html); 25$data = $crawler->filter('table.small tr')->each(function($tr) { 26 return array( 27 $tr->filter('td')->eq(0)->filter('a')->attr('href'), 28 $tr->filter('td')->eq(1)->filter('div')->text() 29 ); 30}); 31var_dump($data);

投稿2016/12/28 06:32

popobot

総合スコア6586

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

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

tajix_japan

2016/12/28 08:37

有難うございます。出来ました!! echo $node->filter('td')->eq(0)->filter('a')->attr('href'); echo $node->filter('td')->eq(0)->filter('a')->text(); echo $node->filter('td')->eq(1)->filter('div')->text(); の形で思い描いていたものを取得することが出来ました。 有難うございました。 深く御礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問