5月 012012
 

今までは、DOMオブジェクトに対して $item->innertext というように、指定したタグで囲まれた
エレメントを意味する”innertext”しか使用しませんでしたが、それ以外にも以下のようなものがあります。

[tag]
対象タグのタグ名

[outertext]
対象タグを含んだテキスト

[innertext]
対象タグに囲まれた中のテキスト

[plaintext]
対象タグに囲まれた中身の表示されるテキスト部分
(タグ部分は入らない)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 
require_once("simple_html_dom.php");
 
$html   = file_get_html('./sample2.html');
 
$items  = $html->find('div');
 
foreach($items as $item){
    echo "[tag]<br />".htmlspecialchars($item->tag)."<br /><br />";
    echo "[outertext]<br />".htmlspecialchars($item->outertext)."<br /><br />";
    echo "[innertext]<br />".htmlspecialchars($item->innertext)."<br /><br />";
    echo "[plaintext]<br />".htmlspecialchars($item->plaintext)."<br />";
}
 
?>

結果は以下。

1
2
3
4
5
6
7
8
9
10
11
[tag]
div
 
[outertext]
<div> <p class="ichi">今日ははれでしたが寒かったですよ</p> <p class="ni">そうですか、それは大変でしたね</p> <p class="ni">以上</p> <a href="http://www.yahoo.co.jp" test="dadada" benki="nnn">ヤフー</a> </div>
 
[innertext]
<p class="ichi">今日ははれでしたが寒かったですよ</p> <p class="ni">そうですか、それは大変でしたね</p> <p class="ni">以上</p> <a href="http://www.yahoo.co.jp" test="dadada" benki="nnn">ヤフー</a>
 
[plaintext]
今日ははれでしたが寒かったですよ そうですか、それは大変でしたね 以上 ヤフー
4月 292012
 
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
require_once("simple_html_dom.php");
 
$html   = file_get_html('./sample.html');
 
$items  = $html->find('a');
 
foreach($items as $item){
    echo $item->href."<br />";
}
 
?>

10行目で “$item->href” とすることで、aタグのhref属性を参照しています。

結果は以下のようになります。

1
http://www.yahoo.co.jp

— スクレイピング対象のhtmlファイル(sample.html) —

1
2
3
4
5
6
7
8
<title>タイトルですよ</title>
<h1>ヘッダーですよね</h1>
<div>
<p class="ichi">今日ははれでしたが寒かったですよ</p>
<p class="ni">そうですか、それは大変でしたね</p>
<p class="ni">以上</p>
<a href="http://www.yahoo.co.jp">ヤフー</a>
</div>
4月 272012
 
1
find('p[id=foo]');

find()の第一引数にはCSSのセレクターで対象タグを指定します。

今回は属性を指定する方法をご紹介します。

こんな感じになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
require_once("simple_html_dom.php");
 
$html   = file_get_html('./sample.html');
 
$items  = $html->find('a[href=http://www.yahoo.co.jp]');
 
foreach($items as $item){
    echo $item->innertext;
}
 
?>

上記の「find(‘a[href=http://www.yahoo.co.jp]‘)」のところの意味は、

「hrefという属性に”http://www.yahoo.co.jp”という値を持ったaタグのオブジェクトを得る」となります。

なので、結果は以下のようになります。

1
ヤフー

— スクレイピング対象のhtmlファイル(sample.html) —

1
2
3
4
5
6
7
8
<title>タイトルですよ</title>
<h1>ヘッダーですよね</h1>
<div>
<p class="ichi">今日ははれでしたが寒かったですよ</p>
<p class="ni">そうですか、それは大変でしたね</p>
<p class="ni">以上</p>
<a href="http://www.yahoo.co.jp">ヤフー</a>
</div>
4月 232012
 

次は、find()にもうひとつ引数を指定して、オブジェクトをひとつだけ得ます。

find()の二つ目の引数は、一つ目の引数で該当したオブジェクトのなかから何番目のオブジェクトかを
決定します。0から始まるので一つ目が0、n番目を指定するときはn-1を指定します。

1
2
3
4
5
6
7
8
9
10
<?php
 
require_once("simple_html_dom.php");
 
$html   = file_get_html('./sample.html');
 
$item   = $html->find('p', 1);
 
echo $item->innertext;
?>

この場合結果は以下になります。

1
そうですか、それは大変でしたね

find(‘p’, 1) としているので、二番目のpタグが出力されていることがわかります。

— スクレイピング対象のhtmlファイル(sample.html) —

1
2
3
4
5
6
7
8
<title>タイトルですよ</title>
<h1>ヘッダーですよね</h1>
<div>
<p class="ichi">今日ははれでしたが寒かったですよ</p>
<p class="ni">そうですか、それは大変でしたね</p>
<p class="ni">以上</p>
<a href="http://www.yahoo.co.jp">ヤフー</a>
</div>
4月 212012
 

まずは、タグ名だけを指定してスクレイピングしてみます。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
require_once("simple_html_dom.php");
 
$html   = file_get_html('./sample1.html');
 
$items  = $html->find('p');
 
foreach($items as $item){
    echo $item->innertext."<br />";
}
?>

1. 3行目の require_once(‘simple_html_dom.php’); でPHP Simple HTML DOM Parser を読み込みます。

2. file_get_html(”); で、解析対象ページのURLを指定して、ページを読み込みます。

3. file_get_htmlで得たDOMオブジェクトの find() 関数に引数をひとつ入れて呼び出します。
この引数にはCSSのようなセレクタを入れます。
今回の場合は’p’となっているので、p タグを指定してます。
こうすると 対象のページの p タグすべてを指定することになり、その結果を$tagsに代入してます。

4. $tags には複数のpタグのオブジェクトが入っているので、各pタグのオブジェクトをforeachで取り出して、
各pタグオブジェクトのinnertextを出力します。
innertextはオブジェクトの内部のテキストを表示します。
innertextは、たとえば「<p>ここになります。</p>」というタグがあった場合「ここになります。」
がinnertextに該当する部分になります。

このphpスクリプトにアクセスすると以下のような結果が得られます。

1
2
3
今日ははれでしたが寒かったですよ
そうですか、それは大変でしたね
以上

— スクレイピング対象のhtmlファイル(sample.html) —

1
2
3
4
5
6
7
8
<title>タイトルですよ</title>
<h1>ヘッダーですよね</h1>
<div>
<p class="ichi">今日ははれでしたが寒かったですよ</p>
<p class="ni">そうですか、それは大変でしたね</p>
<p class="ni">以上</p>
<a href="http://www.yahoo.co.jp">ヤフー</a>
</div>
4月 182012
 

今回は前回作ったDOMオブジェクトを使用して実際に基本的なスクレイピングをしていきます。

スクレイピングをするということは、先ほど作成したインターネット上のページ中の全部もしくは
一部の情報を採取するということになります。

ということで、ページ上のほしい情報を指定する必要があります。

そのためのコマンドが find() になります。

では具体的にどのように使うかを示していきます。

1. タグ名だけを指定してオブジェクトを得る
$ret = $html->find(‘a’);
-> DOMオブジェクトが持つ’a’タグすべてを$retに格納する。

2. タグ名と何番目のタグかを指定してオブジェクトを得る
$ret = $html->find(‘a’, 0);
-> DOMオブジェクトが持つ’a’タグの中で、最初のものだけを$retに格納する。

3. タグとidを指定してオブジェクトを得
$ret = $html->find(‘div[id=foo]‘);
-> DOMオブジェクトが持つ’div’タグの中で、idが’foo’のものを$retに格納する。

4. タグと所持するattributeを指定してオブジェクトを得る場合
$ret = $html->find(‘div[id]‘);
-> DOMオブジェクトが持つ’div’タグの中で、id属性を持つものだけを$retに格納する。

5. 所持する属性を指定してオブジェクトを得る場合
$ret = $html->find(‘[id]‘);
-> DOMオブジェクトが持つオブジェクトのなかで、id属性を持つタグすべてを$retに格納する。

4月 152012
 

とりあえず、「simple_html_dom.php」をスクレイピングを実施するファイルからインクルード
できる場所に配置してください。

PHP Simple HTML DOM Parserを使ってみる

とりあえず使ってみます。

そのまえに、スクレイピング対象のサンプルページとして以下のファイルを用意して置いてください。

(sample.html) ※今後もこのファイルを対象にスクレイピングをしていきます。

1
2
3
4
5
6
7
8
<title>タイトルですよ</title>
<h1>ヘッダーですよね</h1>
<div>
<p class="ichi">今日ははれでしたが寒かったですよ</p>
<p class="ni">そうですか、それは大変でしたね</p>
<p class="ni">以上</p>
<a href="http://www.yahoo.co.jp">ヤフー</a>
</div>

ためしに上記から「それは大変でしたね」を選択する例を提示します。
(sample01.php)

1
2
3
4
5
6
7
<?php
require_once('simple_html_dom.php');
 
$html   = file_get_html('./sample.html');
$item   = $html->find('p', 1);
printf("$item");
?>

※ simple_html_dom.phpはパスが通っている場所においてある前提です。

これにより以下の結果を得られます。

[簡単に解説]
2行目でsimple_html_dom.phpをrequireすることで、”PHP Simple HTML Parser”の機能が使えるようになります。
4行目ではローカルの同じディレクトリにあるsample.htmlというファイルを読み込んでDOMオブジェクトとして$htmlに代入してます。
5行目では$html->find(‘p’,1)とありますが、これはDOMオブジェクトである$htmlから、「2個目のpタグを探せ」という命令になります。探し出した結果を$itemに代入してます。
(ちなみに、find(‘p’,0)であれば1番目のpタグ)
6行目では5行目で得た二番目のpタグをそのまま出力してます。
出力される内容としては以下になります。

1
<p class="ni">そうですか、それは大変でしたね</p>

これで一応simple html dom parserを動かせました。

今後はいろいろな場面での使い方を解説していきたいと思います。

ご清聴ありがとうございました。

4月 112012
 

PHP Simple HTML DOM Parser の基本的な使い方を説明していきます。

基本的には以下を参照して記載さいてますので、こちらも参考にしてください。
http://simplehtmldom.sourceforge.net/manual.htm

PHP Simple HTML DOM Parser における DOM オブジェクトの作り方

スクレイピングをするには対象のページをDOMオブジェクトにする必要があります。

まず、スクレイピングの対象は以下の三つがあります。

1. HTML文字列

2. インターネット上のページ(URL)

3. ローカルのhtmlファイル

上記の3つについてオブジェクトを作成する方法は2種類の方法があります。

オブジェクト作成時にをparse対象を読み込む場合

1. HTML文字列
$html = str_get_html(‘<html><body>Hello!</body></html>’);

2.インターネット上のページ(URL)
$html = file_get_html(‘http://yamanare.moko-moko.jp/’);

3. ローカルのhtmlファイル
$html = file_get_html(‘test.htm’);

空のオブジェクトを作成後、load()関数とload_file()関数で読み込む場合

まず、空のDOMオブジェクトを作成します。
$html = new simple_html_dom();

1. HTML文字列
$html->load(‘<html>&ltbody>こんにちわ</body></html>’);

2. インターネット上のページ(URL)
$html->load_file(‘http://www.google.com/’);

3. ローカルのhtmlファイル
$html->load_file(‘sample01.html’);

4月 092012
 

PHP Simple HTML DOME Parserとは

PHP Simple HTML DOM Parserは、jQueryチック(つまりcssセレクタチック)にインターネット上のHTMLファイルを解析するライブラリです。

これを使うことにより手軽にスクレイピングを行うことができます。

PHP Simple HTML DOME Parserのダウンロードとインストール

まずは、以下のURLからライブラリをダウンロードします。

2011年12月24日時点では(クリスマスイヴ!?)simplehtmldom_1_5.zip でした。

http://sourceforge.net/projects/simplehtmldom/

展開すると以下のようなファイルが現れます。
・app
・change_log.txt
・example
・manual
・simple_html_dom.php
・simplehtmldom_1_5.zip
・testcase

この中で必要なのは実は「simple_html_dom.php」だけなんです。

その他のファイルはサンプルなどですので、見ておくと参考になると思います。

この「simple_html_dom.php」をrequireして、simple html domの機能を使います。

4月 072012
 

$wsql->set_user_agent(‘MyAgentName/0.9′);
$wsql->set_referer(‘http://www.jonasjohn.de/custom/referer/’);
user_agentや、refererを任意に設定できる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    include_once("../../snoopy.class.php");
    include_once("../htmlsql.class.php");
 
    $wsql = new htmlsql();
    $wsql->set_user_agent('MyAgentName/0.9');
    $wsql->set_referer('http://www.jonasjohn.de/custom/referer/');
 
    if (!$wsql->connect('url', 'http://example.com/sample.html')){
        print 'Error while connecting: ' . $wsql->error;
        exit;
    }
 
    if (!$wsql->query('SELECT * FROM a')){
        print "Query error: " . $wsql->error;
        exit;
    }
 
    foreach($wsql->fetch_array() as $row){
        print_r($row);
    }
?>

1. $wsql = new htmlsql();
で、htmlsqlクラスのオブジェクトを作成し、$wsqlに代入。

2. $wsql->set_user_agent(‘MyAgentName/0.9′);
で、アクセスするagentを’MyAgentName/0.9′と設定する

3. $wsql->set_referer(‘http://www.jonasjohn.de/custom/referer/’);
で、参照元のページを’http://www.jonasjohn.de/custom/referer/’と設定する。

4. $wsql->connect(‘url’, ‘http://example.com/sample.html’)
で、第二引数をURLとしてアクセスします。

3. $wsql->query(‘SELECT * FROM a’)
で、2.で得たFILEに対しquery()の第一引数で指定したSQL文を実行します。
ここでは、aタグのすべての情報を抽出します。

4. foreach($wsql->fetch_array() as $row){
で、3.で得たSQLクエリの結果を取り出していきます。

[出力結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Array
(
    [href] => http://www.yahoo.co.jp
    [tagname] => a
    [text] => yapuu
)
 
Array
(
    [href] => http://www.kakaku.com
    [tagname] => a
    [text] => kakakukomo
)
 
Array
(
    [href] => ./index.html
    [tagname] => a
    [text] => 同じフォルダ
)
 
Array
(
    [href] => /home/takano/public_html/sample.html
    [tagname] => a
    [text] => 絶対パス
)