読者です 読者をやめる 読者になる 読者になる

Ba.とWEBと梅干し太郎

WEB制作・プログラミング・音楽の学習したこと・つくったもののアウトプットブログです。あとは日記。

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));

できた。
f:id:masayannuu:20160926083229p:plain

超ざっくり解説というか、メモ
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使います。