我一直在尝试使用 HTML DOM 对象来解析网页,以便将它们用于应用程序来扫描它们的 SEO 质量。
但是我遇到了一些问题。出于测试目的,我编写了一个小型 HTML 页面,其中包含以下不正确的 HTML:
<head>
<meta name="description" content="randomdesciption">
</head>
<title>sometitle</title>
正如您所看到的,标题位于 head 标签之外,这是我试图检测的错误。
现在问题来了,当我使用 cURL 捕获此页面的响应字符串,然后将其发送到 DOM 文档以将其加载为 HTML 时,它实际上通过添加另一个来修复此问题<head>
and </head>
标题周围的标签。
<head>
<meta name="description" content="randomdesciption">
</head>
<head><title>sometitle</title></head>
我检查了 cURL 响应数据,实际上这不是问题,不知何故 PHP DOMDocument 在执行 loadHTML() 方法期间修复了 html 语法。
我还尝试通过将 DOMDocument 恢复、替代实体和 validateOnParse 属性设置为 false 来关闭它们,但没有成功。
我一直在搜索谷歌,但到目前为止我无法找到任何答案。我想对于那些真正希望不修复损坏的 HTML 的人来说有点罕见。
有人知道如何防止 DOMDocument 修复损坏的 HTML 吗?
更新:从 PHP 5.4 开始,您可以使用HTML_PARSE_NO_IMPLIED
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);
原答案如下
你不能。理论上有一面旗帜HTML_PARSE_NO_IMPLIED对于 libxml 中的内容以防止添加隐含标记,但无法从 PHP 访问它。
顺便说一句,这种特殊的行为似乎取决于LIBXML_VERSION
used.
运行这个片段:
<?php
$html = <<< HTML
<head>
<meta name="description" content="randomdesciption">
</head>
<title>sometitle</title>
HTML;
$dom = new DOMDocument;
$dom->loadHTML($html);
$dom->formatOutput = true;
echo $dom->saveHTML(), LIBXML_VERSION;
在我的机器上会给
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><meta name="description" content="randomdesciption"></head>
<title>sometitle</title>
</html>
20707
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)