我已经阅读了一些涉及未申报实体的问题。我的问题有点不同。我正在按照这个程序从网上抓取各种页面。1.首先对文件运行php tidy函数。2.然后从中创建一个dom文档,并使用xpath获取某些节点的值。(仅限table,para和blockquotes)
我的问题很简单:
1.警告:DOMDocument::loadHTML(): ID hp.global.servicebox.links.arztsuche 已在实体中定义,行:2112
2.XML错误:第2679行未声明的实体警告
我意识到第一个警告可能是因为我先通过 tidy 函数,然后再通过 loadHTML。
但是第二个问题确实很麻烦。它只是拒绝产生任何输出,我失去了一切。
在这个网站上阅读,发现一个未声明的实体,应该事先声明,但你会意识到,鉴于我的任务性质,这是不可能的(看在上帝的份上,我正在抓取网络)。
我已启用
var_dump(libxml_use_internal_errors(true));
但是,除了它不会弄乱我的终端之外,它根本没有帮助。对于初学者,没有关于如何处理此错误或任何与此相关的错误的文档。
我意识到这不是第一次有人遇到这个问题,我确信解决方案就在那里,我似乎找不到它。成千上万的人警告您不要使用正则表达式来解析 html 或 xml,但很少有人能够解决我们使用解析器所面临的问题——就像我所面临的那样。
干杯,理查德, - 一个心怀不满的 HTML 解析器爱好者。
编辑:一些附加信息——>这是我正在使用的整洁功能。
function cleaning($what_to_clean, $tidy_config='' )
{
$config = array
(
'show-body-only' => false,
'clean' => true,
'char-encoding' => 'utf8',
'add-xml-decl' => true,
'add-xml-space' => true,
'output-html' => false,
'output-xml' => false,
'output-xhtml' => true,
'numeric-entities' => false,
'ascii-chars' => false,
'doctype' => 'strict',
'bare' => true,
'fix-uri' => true,
'indent' => true,
'indent-spaces' => 4,
'tab-size' => 4,
'wrap-attributes' => true,
'wrap' => 0,
'indent-attributes' => true,
'join-classes' => false,
'join-styles' => false,
'enclose-block-text' => true,
'fix-bad-comments' => true,
'fix-backslash' => true,
'replace-color' => false,
'wrap-asp' => false,
'wrap-jste' => false,
'wrap-php' => false,
'write-back' => true,
'drop-proprietary-attributes' => false,
'hide-comments' => false,
'hide-endtags' => false,
'literal-attributes' => false,
'drop-empty-paras' => false,///dont drop empty paras
'enclose-text' => true,
'quote-ampersand' => true,
'quote-marks' => false,
'quote-nbsp' => true,
'vertical-space' => true,
'wrap-script-literals' => false,
'tidy-mark' => false,
'merge-divs' => false,
'repeated-attributes' => 'keep-last',
'break-before-br' => false,///dont add line breaks before breakes
);
if( $tidy_config == '' )
{
$tidy_config = &$config;
}
$tidy = new tidy();
$out = $tidy->repairString($what_to_clean, $tidy_config, 'UTF8');
unset($tidy);
unset($tidy_config);
return($out);
}