HTMLをXML形式にすれば簡単にスクレイピングできるんじゃないか、と思ってやってみたメモ
最近、個人的にスクレイピングにハマっています。
でも流石に、毎回htmlのdom構造を見てゴリゴリするの疲れてきました。
うーん、楽をしたい。そういえば、xmlは体系的にまとまっててhtmlより簡単に値をとれるよなあということで、試してみました。
htmlをxmlに変換できないかなと探してみた所、phpに便利クラスありました。
PHP: DOMDocument - Manual
<?php $html = file_get_contents('http://saru-no-diary.hateblo.jp/'); $file_name = "test.json"; $dom = new DOMDocument(); $dom->formatOutput = true; $dom->loadHTML($html); $xml_str = $dom->saveXML(); $xml_obj = simplexml_load_string($xml_str); var_dump($xml_obj->body); $parsed_dom = json_decode(json_encode($xml_obj), true); file_put_contents($file_name, serialize($parsed_dom));
できた。
超ざっくり解説というか、メモ
htmlを読み込む -> XML形式に変換する -> simplexml_load_stringで要素にアクセスできるように変換 -> jsonにしてもっとアクセスしやすくする
simplexml_load_stringがとても便利そうだったのです。
※公式マニュアルのexampleより拝借
http://php.net/manual/ja/function.simplexml-load-string.php
<?php $string = <<<XML <?xml version='1.0'?> <document> <title>Forty What?</title> <from>Joe</from> <to>Jane</to> <body> I know that's the answer -- but what's the question? </body> </document> XML; $xml = simplexml_load_string($string); print_r($xml); ?>
実行結果はこれ。
SimpleXMLElement Object ( [title] => Forty What? [from] => Joe [to] => Jane [body] => I know that's the answer -- but what's the question? )
$xml->bodyで値をとれます。
やってみた感想
手間的にはphpqueryでとってくるのとあんまり変わらん気がする。
ライブラリは偉大だなあと思いました。
あと、import.io使います。