前提
- 抽出したい要素を一意に特定できるよう考慮しなければならない
- 複数ページのある要素を抽出したいという場合には、その要素が特定の部分にしか記載されていないのであればそのままスクレイピングをしても問題なし
- もし複数の箇所に記載されているのであれば、まずは記載箇所をパターン化してからスクレイピングする必要がある
下準備
$html = 'https://xxx.com/index.html';
$html = file_get_contents($store_html);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
unset($dom);
- @」でエラーを抑制しているのは HTML の記述に誤りがあった場合でもエラーを表示しないようにするため
値の取得の例
$tar = $xpath->query('//body//p[contains(.,"タイトル")]/following-sibling::div[@class="main"]/span')->item(0)->nodeValue;
- 「//」で途中のパスを省略することができる。
- 上記はbodyタグの中から、文言に"タイトル"を含むpタグの隣の、class名がmainのdivタグのなかの、spanタグの中のテキストを取得している。
- query() は一致した全ての要素をリストの形で返すため item(0) として最初の要素を指定する必要がある。
スクレイピングしたい対象によって取得方法が異なるためその都度調べるしかない
参考リンク
https://php-archive.net/php/dom-scraping/
http://cloudcafe.tech/?p=2456