2

我尝试将以下代码用于 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) { } 
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它是否不是NULLFALSE

$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 回答