HTML DOMNodelist?

时间:2012-06-16 09:45:12

标签: php domdocument

我尝试将以下代码用于HTML页面,但它不起作用。如何在一个页面中检索和操作所有输出的HTML元素?

$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) { } 

2 个答案:

答案 0 :(得分:3)

一些DOMDocument调试提示。

  

如果适用,请升级到最新的PHP 5.4,因为它会为var_dump和朋友提供有关DOMDocument的更多信息。

我采用你的小例子,并将添加一些提示如何调试代码:

$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,如果它不是NULLFALSE

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

长度将告诉您匹配了多少元素。

实施例/ Demo

<?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)

希望这有用。

答案 1 :(得分:1)

使用PHP Simple HTML DOM Parser

如果您在身体下方的div下面有图像,您会说:

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

这只是一个例子,但你可以使用这个类做更多的事情。

请参阅

中的手册