1

我已经阅读了一些涉及未申报实体的问题。我的问题有点不同。我正在按照这个程序从网上抓取各种页面。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);

}

4

0 回答 0