我一直试图通过使用
HTML DomObject来解析网页,以便将它们用于应用程序以扫描它们的SEO质量.
但是我遇到了问题.出于测试目的,我写了一个包含以下不正确的html的小html页面:
<head> <Meta name="description" content="randomdesciption"> </head> <title>sometitle</title>
现在出现了问题,当我使用curl从此页面捕获响应字符串然后将其发送到dom文档以将其加载为HTML它通过在标题周围添加另一个标签来实际修复此问题.
<head> <Meta name="description" content="randomdesciption"> </head> <head><title>sometitle</title></head>
我已经检查了卷曲响应数据并且实际上不是问题,在执行loadHTML()方法时,PHP DomDocument以某种方式修复了html语法.
我还尝试通过将它们设置为false来关闭DomDocument recover,substituteEntities和validateOnParse属性,但没有成功.
我一直在搜索谷歌,但到目前为止我找不到任何答案.我想对某些人来说实际上希望破解的HTML不被修复是很少见的.
有谁知道如何防止DomDocument修复我破碎的HTML?
提前致谢
更新:从PHP 5.4开始,您可以使用
HTML_PARSE_NO_IMPLIED
$dom->loadHTML($html,LIBXML_HTML_NOIMPLIED);
原答案如下
你不能.在理论上there is a flag HTML_PARSE_NO_IMPLIED
for that in libxml阻止添加隐含标记,但其无法从PHP访问.
在旁注中,这种特殊行为似乎取决于所使用的LIBXML_VERSION.
运行此代码段:
<?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