解決済み

PHPでHTMLをXMLに変換したときに消える内容

  • 困ってます
  • 質問No.9036511
  • 閲覧数286
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数1

お礼率 100% (1/1)

教えてください。

スクレイピングのために、よく分からないままに、
PHPでHTMLをXMLに変換して、Xpathで参照しようとしています。

が。

その前段で、「HTML内に存在する内容が、XMLに変換した際に
消えてしまう」という現象に悩まされております。

例を挙げますと、

---------------------------------------
<html>
<body>
<table>
<tr>
<td><b>foo</b>
bar<br>
</td>
</tr>
</table>
</body>
</html>
---------------------------------------

みたいなページを、

---------------------------------------
<?php
$html = file_get_contents('http://xxxxxxxxxxxxxxxxx.com/foobar.html');
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xml = simplexml_import_dom($dom);
print_r($xml);
?>
---------------------------------------

のように処理すると、

---------------------------------------
SimpleXMLElement Object ( [body] => SimpleXMLElement Object ( [table] => SimpleXMLElement Object ( [tr] => SimpleXMLElement Object ( [td] => SimpleXMLElement Object ( [b] => foo [br] => SimpleXMLElement Object ( ) ) ) ) ) )
---------------------------------------

のような結果になって、「あれ?fooはいるけど、barは何処いった?」となります。

分かっている方には、「そりゃ、おまえ、あたりまえだよwww」
「つーか、なにやっとんのwww」って感じなのかもしれませんが、
さっぱり分かりません。

元のHTMLの書きぶりがダメだからということでしょうか。

お手数をお掛けしますが、どうぞ、ご教授ください。

よろしくお願いいたします。

質問者が選んだベストアンサー

  • 回答No.1

ベストアンサー率 77% (407/525)

【原因】

XMLは何も無いところに値を置くことが出来ません。これは例えばもし、もとのHTMLの

bar

の部分が

<span>bar</span>

であれば正常に残ることを意味します。


【解決策】

DOMDocumentのまま使いましょう。やや不便な面もありますが、スクレイピングに使えることには変わりありません。

PHPネイティブのDOMによるスクレイピング入門
http://qiita.com/mpyw/items/c0312271819baee09132

不便を感じてきたところでGoutteなどのライブラリの導入を検討するのもありです。
お礼コメント
penta012

お礼率 100% (1/1)

教えていただいたうえに、参考サイトまで提示してもらい、感激です!

しかし、通常のHTMLにはタグで囲われてない文字もかなりの頻度で
あると思うのですが、そういうのはポロポロ抜けてしまうということ
になってしまうんでしょうかねぇ。

それこそ、自動的にspanタグで囲うような処理を間に挟んだりして
もらいたいもんだなぁ、と勝手ながら、思ってしまいました。

なのですが、実際の解決法については、教えていただいた参考サイトに、
「自分で正規表現を使って必要部分だけを抜き出す方法は、全ての方法
の中で最も高速」とあったことで、今更ながら「ですよねー」と思い至り、
file_get_contentsで取得したものを、正規表現で削り取るというような、
素朴で泥臭い方法に変えまして、目的は何とか遂げることができました。

ちょっとハラホロヒレハレな結末になってしまいましたが、
ご助言がなければ、もっとヒーヒー言っていたことと思います。

非常に、助かりました。
ありがとうございました。

感謝感謝です!!!
投稿日時 - 2015-08-26 20:46:59
結果を報告する
    • 2015-08-27 12:41:39
    • コメントNo.1

    >> しかし、通常のHTMLにはタグで囲われてない文字もかなりの頻度で あると思うのですが、そういうのはポロポロ抜けてしまうということ になってしまうんでしょうかねぇ。 ...続きを読む

関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ