2

HTML ページに次のコードを使用しようとしましたが、機能しません。出力されたすべての HTML 要素を 1 つのページで取得して操作するにはどうすればよいですか?

$doc = new DOMDocument;
$doc->load('http://localhost/foo/index.php');

$items = $doc->getElementsByTagName('img');

foreach ($items as $item) {
    echo $item->nodeValue . "\n";
}

編集:

$dom = new DOMDocument;
$html = 'http://localhost/foo/index.php';
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
    echo $dom->saveHtml($node), PHP_EOL;

}

上記のコードは何も出力しません

コードのデバッグ:

<?php

$dom = new DOMDocument;
$html = 'http://localhost/foo/index.php';

var_dump($dom->loadHTML($html));

echo '<br />';

var_dump($dom);

echo '<br />';

var_dump($dom->saveHTML());

echo '<br />';

var_dump($dom->getElementsByTagName('a'));

echo '<br />';

foreach ($dom->getElementsByTagName('a') as $node) {

    var_dump($node);

    echo '<br />';

    var_dump( $dom->saveHtml($node) );
    echo '<br />';

}

?>

デバッグ結果:

bool(true)
object(DOMDocument)#1 (0) { }
string(170) "

http://localhost/foo/index.php
"
object(DOMNodeList)#2 (0) { } 
4

2 に答える 2

3

いくつかのDOMDocumentデバッグのヒント。

該当する場合は、最新のPHP 5.4にアップグレードしてください。これにより、 var_dumpforDOMDocumentとfriendsに関する詳細情報が得られます。

私はあなたの小さな例を取り上げ、コードをデバッグする方法のヒントをいくつか追加します。

$dom = new DOMDocument;
$html = 'http://localhost/foo/index.php';
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
    echo $dom->saveHtml($node), PHP_EOL;
}

読み込みは機能しましたか?それはこの行です:

$dom->loadHTML($html);

ドキュメントの内容を出力することで、ドキュメントの内部を確認できます。それをブラウザに表示する場合は、ドキュメントのソースを調べる必要があります。または、出力をhtmlspecialchars次のように変更するだけです。

var_dump(htmlspecialchars($dom->saveHTML()));

これにより、ブラウザ内のHTMLバリアントにそのままロードされたドキュメントが提供されます。

デバッグしたい次の部分は、次の結果ですgetElementsByTagName

foreach ($dom->getElementsByTagName('a') as $node) {

最初にそれを変数に割り当て、次にlengthそうでないNULLかどうかを確認しFALSEます。

$aTags = $dom->getElementsByTagName('a');
var_dump(htmlspecialchars($aTags), $aTags->length());

長さは、一致した要素の数を示します。

例/デモ

<?php

$dom = new DOMDocument;
$html = 'http://localhost/foo/index.php';
$dom->loadHTML($html);
echo 'Document HTML loaded: ', var_dump($dom->saveHTML()), "\n";
$aTags = $dom->getElementsByTagName('a');
echo 'A Elements found: ', var_dump($aTags->length), "\n";
foreach ($aTags as $node) {
   echo $dom->saveHtml($node), "\n";
}

出力:

Document HTML loaded: string(171) "<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>http://localhost/foo/index.php</p></body></html>
"

A Elements found: int(0)

これがお役に立てば幸いです。

于 2012-06-16T12:20:42.903 に答える
1

PHP シンプルな HTML DOM パーサーを使用する

body の下の div の下に画像がある場合は、次のように言います。

$html->find('body',0)->find('div[id=foo]',0)->find('img')->src;

これは単なる例ですが、このクラスを使用してさらに多くのことができます。

マニュアルを参照してください。

于 2012-06-16T09:51:14.273 に答える