用于抑制错误和警告的选项不会像 loadXML() 那样在此函数中起作用
例如
<?php
$doc->loadHTMLFile($file, LIBXML_NOWARNING | LIBXML_NOERROR);
?>
不起作用。
您必须使用
<?php
libxml_use_internal_errors(true);
$doc->loadHTMLFile($file);
?>
并根据需要处理异常。
(PHP 5, PHP 7, PHP 8)
DOMDocument::loadHTMLFile — 从文件加载 HTML
该函数解析名为 filename
的文件中的 HTML 文档。与加载 XML 不同,HTML 不必是格式良好的才能加载。
此函数使用 HTML 4 解析器解析输入。现代 Web 浏览器使用的 HTML 5 的解析规则不同。根据输入,这可能会导致不同的 DOM 结构。因此,此函数不能安全地用于清理 HTML。
解析 HTML 时,行为可能取决于所使用的 libxml
版本,尤其是在边缘情况和错误处理方面。对于符合 HTML5 规范的解析,请使用 PHP 8.4 中添加的 Dom\HTMLDocument::createFromString() 或 Dom\HTMLDocument::createFromFile()。
例如,某些 HTML 元素在遇到时会隐式关闭父元素。自动关闭父元素的规则在 HTML 4 和 HTML 5 之间有所不同,因此 DOMDocument 所看到的最终 DOM 结构可能与 Web 浏览器所看到的 DOM 结构不同,这可能使攻击者能够破坏最终的 HTML。
如果将空字符串作为 filename
传递或命名了空文件,则会生成警告。此警告不是由 libxml 生成的,不能使用 libxml 的错误处理函数 处理。
虽然格式错误的 HTML 应该成功加载,但此函数在遇到错误标记时可能会生成 E_WARNING
错误。可以使用 libxml 的错误处理函数 处理这些错误。
版本 | 描述 |
---|---|
8.3.0 | 此函数现在具有暂定的 bool 返回类型。 |
8.0.0 | 静态调用此函数现在将抛出 Error。以前,会引发 E_DEPRECATED 。 |
示例 #1 创建文档
<?php
$doc = new DOMDocument();
$doc->loadHTMLFile("filename.html");
echo $doc->saveHTML();
?>
用于抑制错误和警告的选项不会像 loadXML() 那样在此函数中起作用
例如
<?php
$doc->loadHTMLFile($file, LIBXML_NOWARNING | LIBXML_NOERROR);
?>
不起作用。
您必须使用
<?php
libxml_use_internal_errors(true);
$doc->loadHTMLFile($file);
?>
并根据需要处理异常。
<?php
// 尝试此 html 列表示例以获取所有节点/包括一些 getElementsByTagName 选项:
$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);
// 示例 1:
$elements = $doc->getElementsByTagName('*');
// 示例 2:
$elements = $doc->getElementsByTagName('html');
// 示例 3:
//$elements = $doc->getElementsByTagName('body');
// 示例 4:
//$elements = $doc->getElementsByTagName('table');
// 示例 5:
//$elements = $doc->getElementsByTagName('div');
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "<br/>". $element->nodeName. ": ";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "\n";
}
}
}
?>
在这篇文章 http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html 中,我发现了一种使用 DOMDocument、loadHTMLFile 和 saveHTML() 获取 URL 内容的简单方法。
function getURLContent($url){
$doc = new DOMDocument;
$doc->preserveWhiteSpace = FALSE;
@$doc->loadHTMLFile($url);
return $doc->saveHTML();
}
这将 HTML 放入一个 DOM 对象中,该对象可以按单个标签、属性等进行解析。这是一个获取所有 'href' 属性和相应的节点值的示例,这些属性和值来自 'a' 标签。非常酷....
<?php
$myhtml = <<<EOF
<html>
<head>
<title>My Page</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">Another Hello World!</a></p>
</body>
</html>
EOF;
$doc = new DOMDocument();
$doc->loadHTML($myhtml);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
echo $tag->getAttribute('href').' | '.$tag->nodeValue."\n";
}
?>
这将输出
/mypage1 | Hello World!
/mypage2 | Another Hello World!
如果你想抑制 `loadHTMLFile($url)` 的输出警告,在前面加上 `@` 符号。这甚至在
<?php
$load = @$dom->loadHTMLFile($url);
?>
请注意,此函数不会解析 HTML 文件中的各个标签 - 它全部作为“黑盒”加载,你最终得到一个 XML 小部件,它只包含完整的 HTML 块。
我原本希望它可以作为一种 HTML 验证器/解析器,但似乎并非如此。