
[code]

    $html = file_get_contents("http://www.amazon.co.jp/s/fst=nb___mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url;=node%3D466280&field-keywords;=%E6%96%B0%E5%88%8A");
      //sjis変換
      $domDocument = new DOMDocument();
      $domDocument->loadHTML($html);
      $xmlString = $domDocument->saveXML();
      $xmlObject = simplexml_load_string($xmlString);
      var_dump($xmlObject);
    
[/code]

結果

[code]

     bool(false)
    
[/code]

となる。  
別にamazon以外のサイトでやってみたらちゃんと整形されたものが出てきました。  
この違いはなんなのでしょうか？


CC BY-SA 3.0
2015-06-08T08:15:09.400
11112
2015-06-09T00:05:45.190
10049
question
php api
phpでAmazonのHTMLを取得してasinコードを取得したい


## 概要

質問のコメントにもありますが、例示されたURLで試すと、パースエラーが発生します。  
Amazon が返す HTML に文法エラーがあるためです。

こういったエラーがあるものを何とか通す方法はちょっと思い付かないので、原因の指摘のみで。

## 詳細

手持ちの環境 (PHP 5.6.9-pl0-gentoo) では、以下のエラーが発生しました (長いので最初の部分だけ)。

[code]

    PHP Warning:  simplexml_load_string(): Entity: line 1771: parser error : Double hyphen within comment: <!--
    <div id="main" skeleton-key="results in php shell code on line 1
    
    Warning: simplexml_load_string(): Entity: line 1771: parser error : Double hyphen within comment: <!--
    <div id="main" skeleton-key="results in php shell code on line 1
    PHP Warning:  simplexml_load_string(): <div id="main" skeleton-key="results--searchTemplate defaultLayout so_jp_ja--lef in php shell code on line 1
    
[/code]

該当部分の XML を見ると、コメント `<!--` と `\-->` の間に `\--`
が出現しているため、不正なコメントとなっています。このため、パースエラーが発生します。  
試しに、このXMLソースから、該当部分の `<!--` から `\-->` までを削除すると、パースに成功します。  
(`\--` を含んではならないという制限 (SGMLとの兼ね合いによるもの)、割と忘れられがちですよね。)

## エラー原因の調査方法

今回は、エラーが発生するコード断片まで分かっているのですから、 `php -a` による対話的シェルを起動して、一行ずつ実行し、適宜
`var_dump()` で変数の内容を確認していけば
(長ければファイルに書き出すのも手)、簡単に原因に辿り着けたと思います。実際、私はそういった方法で原因を把握しました。  
今回の例では、 `$domDocument->loadHTML($html);` と `$xmlObject =
simplexml_load_string($xmlString);`
で警告・エラーメッセージが表示されるので、HTMLがおかしいとすぐ気付けるかと思います。


CC BY-SA 3.0
2015-06-08T13:32:00.860
11127
2015-06-08T13:32:00.860
7831
11112
answer


人間用のHTMLをパースしてデータを取得するのはたいていの場合筋が悪い方法なので、APIを使うべきです。検索結果から商品を調べたいようですが、[Product
Advertising
API](https://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html)がたぶん使えるでしょう。


CC BY-SA 3.0
2015-06-09T00:05:45.190
11141
2015-06-09T00:05:45.190
5793
11112
answer