[PHP]htmlからxmlに変換する関数群 : html2xml

phpでスクレイピングしたい時、htmlからxmlへの変換方法をいつも調べるので、
備忘録代わりに変換関数を作成しました。

この手の変換は、作るプログラムによって元ネタがurlだったりhtml文字列だったりします。
また変換先もxmlテキストが欲しいときやDOMDocumentが欲しいなど様々です。
という訳で、冗長ですが全パターン用意しました。

変換パターンによっては、中身がPHPの関数1行だけというラッパーになっている場合も有りますが、網羅しておいたほうが一覧性が良いかと思い、あえて用意しています。


変換可能なパターンは以下通りです。

url        -> html文字列
url        -> DOMDocumentオブジェクト
url        -> xml文字列
 
html文字列 -> DOMDocumentオブジェクト
html文字列 -> xml文字列
 
DOMDocumentオブジェクト -> xml文字列




変換の関数群です。

#****************************************************************
# 指定されたurlの内容をhtml文字列として返す
#****************************************************************
function url2html( $url ) {
    return file_get_contents( $url );
}
 
#****************************************************************
# html文字列をDOMDocumentオブジェクトとして返す
#****************************************************************
function html2xmldoc( $html ) {
    $xmlDoc = new DOMDocument('1.0', 'UTF-8');
 
    $xmlDoc->preserveWhiteSpace = false;
    @$xmlDoc->loadHTML($html);
    return $xmlDoc;
}
 
#****************************************************************
# DOMDocumentオブジェクトをxml文字列として返す
#****************************************************************
function xmldoc2xml( $xmldoc ) {
    return $xmldoc->saveXML();
}
 
#****************************************************************
# 指定されたurlの内容をDOMDocumentオブジェクトとして返す
#****************************************************************
function url2xmldoc( $url ) {
    $html   = file_get_contents( $url );
 
    $xmlDoc = new DOMDocument('1.0', 'UTF-8');  
    $xmlDoc->preserveWhiteSpace = false;
    @$xmlDoc->loadHTML($html);
 
    return $xmlDoc;
}
 
#****************************************************************
# 指定されたurlの内容をxml文字列として返す
#****************************************************************
function url2xml( $url ) {
    $html   = url2html( $url );
    $xmlDoc = html2xmldoc( $html );
    $xml    = xmldoc2xml( $xmlDoc );
    return $xml;
}
 
#****************************************************************
# html文字列をxml文字列として返す
#****************************************************************
function html2xml( $html ) {
    $xmlDoc = html2xmldoc( $html );
    $xml    = xmldoc2xml( $xmlDoc );
    return $xml;
}




htmlをDOMDocumentオブジェクトに変換後、xpathでスクレイピング出来ます。
下記の例では、googleよりキーワード”scraping”で検索し、リンクの一覧(aタグに含まれるhref属性)を出力しています。

$url = "http://www.google.co.jp/#q=scraping";
 
$xml = simplexml_import_dom( url2xmldoc( $url ));
$nodeList = $xml->xpath( "//a" );
 
foreach ($nodeList as $node) {
    echo $node["href"] . "\n";
}




2012/5/31追記:
変換元のhtmlがS-JISだった場合は、DOMDocumentクラスのloadHTML()メソッドで、文字化けしてしまうため、変換がうまくいきません。このような場合は、以下のように2回に分けて変換します。

$html = mb_convert_encoding( url2html( $url ), "HTML-ENTITIES", "SJIS" );
$xml  = simplexml_import_dom( html2xmldoc( $html ));


関連記事

コメントを残す

メールアドレスが公開されることはありません。