我尝试将以下代码用于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) { }
答案 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
,如果它不是NULL
或FALSE
:
$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;
这只是一个例子,但你可以使用这个类做更多的事情。
请参阅
中的手册