0

重複の可能性:
PHP HTML DomDocument getElementById の問題

PHPでGoogle検索から情報を抽出しようとしていますが、検索URLを問題なく読み取れることがわかりましたが、それらから何かを取得することはまったく別の問題です. 多数の投稿と該当する PHP ドキュメントを読んだ後、次のことを思いつきました。

// get large panoramas of montana
$url = 'http://www.google.com/search?q=montana+panorama&tbm=isch&biw=1408&bih=409';
$html = file_get_contents($url);
// was getting tons of "entity parse" errors, so added
$html = htmlentities($html, ENT_COMPAT, 'UTF-8', true); // tried false as well

$doc = new DOMDocument();
//$doc->strictErrorChecking = false; // tried both true and false here, same result
$result = $doc->loadHTML($html);

//echo $doc->saveHTML(); this shows that the tags I'm looking for are in fact in $doc

if ($result === true)
{
    var_dump($result); // prints 'true'
    $tags = $doc->getElementById('center_col');
    $tags = $doc->getElementsByTagName('td');
    var_dump($tags); // previous 2 lines both print NULL
}

探している ID とタグが error_log($html) によって html にあり、$doc->SaveHTNL() によって解析されたドキュメントにあることを確認しました。誰かが私が間違っていることを見ていますか?

編集:

助けてくれてありがとう、しかし私は DOMDocument で壁にぶつかりました。ドキュメントや他のスレッドのどれも、Google 画像クエリでは機能しません。これが私が試したことです:

@Jon リンクを見て、そこにあるすべての提案を試し、getElementByID ドキュメントを見て、そこにあるすべてのコメントも読みました。まだ空の結果セットを取得しています。NULL よりはましですが、それほど多くはありません。

私はxpathトリックを試しました:

$xpath  = new DOMXPath($doc);
$ccol   = $xpath->query("//*[@id='center_col']");

同じ結果、空のセット。

ファイルを読み取った直後に error_log($html) を実行しましたが、ドキュメントには doctype "" があるため、そうではありません。

また、ユーザー「carl2088」が「HTMLドキュメントをロードした場合、私の経験から、getElementByIdはセットアップなしで正常に動作するようです」と言っていることもわかります。Google 画像クエリの場合ではなく、表示されます。

必死で、私は試しました

echo count(explode('center_col', $html)) 

何らかの奇妙な理由で、最初の error_log($html) の後に消えるかどうかを確認します。それは間違いなくそこにあり、文字列は 4 つのチャンクに分割されています。

PHP のバージョン (5.3.15) が 2012 年 8 月 25 日に準拠していることを確認したので、getElementByID をサポートするには古すぎるバージョンではありません。

昨日まで、私は非常に醜い一連の「爆発」を使用して情報を取得していました。恐ろしいコードですが、書くのに 45 分かかり、動作しました。

私は本当に「爆発」ハックを捨てたいと思っていますが、何も達成するのに 5 時間かかるのに対し、機能するものを得るのに 45 分かかるため、正しい方法で物事を行うのは非常に困難です。

DOMDocument を使用した経験のある他の誰かが、私が試すことができるいくつかの追加のトリックを持っている場合、それは大歓迎です。

4

2 に答える 2

0

あなたはJavaScriptを使用していますgetElementByIdgetElementsByTagName?はいの場合、これが問題です

 $tags = $doc->getElementById('center_col');
    $tags = $doc->getElementsByTagName('td');
于 2012-10-18T11:43:28.377 に答える
0

関数$doc->getElementById('center_col');を使用する前に、 DOMDocument->validate()またはDOMDocument->validateOnParseでドキュメントを検証する必要があります。

$doc->validateOnParse = true;
$doc->loadHTML($html);

stackoverflow: getelementbyid-problem

http://php.net/manual/de/domdocument.getelementbyid.php

それは彼のコメントの@Jon投稿の質問にあります!

于 2012-10-18T12:41:52.243 に答える