「Php/Goutte」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→httpリクエストをしないでhtmlだけを解析する方法) |
(→dom操作) |
||
行26: | 行26: | ||
reduce($lambda) callableがfalseを返さないノード | reduce($lambda) callableがfalseを返さないノード | ||
selectLink($value) 指定されたテキストを含むリンクすべてを選択 | selectLink($value) 指定されたテキストを含むリンクすべてを選択 | ||
− | selectButton($value) 指定されたテキストを含むボタンすべてを選択 | + | selectButton($value) 指定されたテキストを含むボタンすべてを選択 |
+ | |||
+ | ==filter指定== | ||
+ | h1 | ||
+ | h1.class1 class指定 | ||
+ | h1#id1 id指定 | ||
+ | body > p | ||
==値取得== | ==値取得== |
2016年2月3日 (水) 09:33時点における最新版
目次
Goutteとは
スクレイピングライブラリです。PHP5.3以降サポート
ベンチマーク
Simple HTML DOM Parserより良いらしい。
参照:http://qiita.com/soarcreator/items/56a971d42b8b640b76a6
使い方
https://github.com/fabpot/goutte
DL
wget https://raw.github.com/fabpot/Goutte/master/goutte.phar
dom操作
filter('h1') CSSセレクタにマッチするノード filterXpath('h1') XPath式にマッチするノード eq(1) 指定したインデックスのノード first() 最初のノード last() 最後のノード siblings() 兄弟のノード nextAll() 後の兄弟ノード previousAll() 前の兄弟ノード parents() 親ノード children() 子ノード reduce($lambda) callableがfalseを返さないノード selectLink($value) 指定されたテキストを含むリンクすべてを選択 selectButton($value) 指定されたテキストを含むボタンすべてを選択
filter指定
h1 h1.class1 class指定 h1#id1 id指定 body > p
値取得
attr($attribute) 最初のノードの、指定した属性の値を返す text() 最初のテキストノードの値を返す html() 最初のHTMLノードを取得する
サンプル
require_once __DIR__ . '/goutte.phar'; use Goutte\Client; $client = new Client(); $url = "http://example.com"; $crawler = $client->request('GET', $url); $dom = $crawler->filter('link'); $dom->each(function($node) { // rss取得 if ($node->attr('type') == "application/rss+xml") { echo $node->attr('href')."\n"; } }); $dom = $crawler->filter('h1'); $dom->each(function($node) { echo $node->text()."\n"; }); $dom = $crawler->filter('a'); $dom->each(function($node) { if (preg_match("!http://!", $node->attr('href'))) { echo $node->attr('href')."\n"; echo $node->text()."\n"; } }); $dom = $crawler->filter('h2.post > a') $dom->each(function ($node) { print $node->text()."\n"; }); //$dom = $crawler->filter('table.content td');
htmlをhttpでとってこずにsetする場合
use Symfony\Component\DomCrawler\Crawler; $html = <<<'HTML' <!DOCTYPE html> <html> <body> <p class="message">Hello World!</p> <p>Hello Crawler!</p> </body> </html> HTML; $crawler = new Crawler($html);
Aタグのリンククリック
$crawler = $client->request('GET', $url); $targetLinkText = 'もっとみる'; $link = $crawler->selectLink($targetLinkText)->link(); $crawler = $client->click($link);
user_agent偽装
$client->setHeader('User-Agent', 'Googlebot-Video/1.0'); $client->setHeader('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36'); // chrome28
httpリクエストをしないでhtmlだけを解析する方法
use Symfony\Component\DomCrawler\Crawler; $crawler = new Crawler(); $crawler->addHtmlContent($html, 'utf-8'); $dom = $crawler->filter('img'); if ($dom) { $dom->each(function($node) use (&$item) { echo $node->attr('src'); }); } $dom = $crawler->filter('a'); if ($dom) { $dom->each(function($node) use (&$item) { echo $node->attr('href'); echo $node->text(); }); }
ISO-8859-1以外をhtmlに含めると文字コードをしていないと文字化けするのでaddHtmlContent()の引数に文字コードを指定する
参考:http://docs.symfony.gr.jp/symfony2/components/dom_crawler.html