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 )); |
関連記事
コメントを残す