宣言されていないエンティティを扱ったいくつかの質問を読みました。私の問題は少し異なります。ネットからさまざまなページをスクレイピングするために、この手順に従っています。1.最初に、ファイルに対して php tidy 関数を実行します。2.次に、そこから dom ドキュメントを作成し、xpath を使用して特定のノードの値を取得します (テーブル、パラ、およびブロック引用符のみ)。
私の問題は簡単です:
1.警告: DOMDocument::loadHTML(): ID hp.global.servicebox.links.arztsuche はすでにエンティティで定義されています。行: 2112
2.XML エラー: 行 2679 で宣言されていないエンティティの警告
最初の警告は、おそらく最初に tidy 関数を通過させ、次に loadHTML を通過させたことが原因であることに気付きました。
しかし、2番目の問題は本当に厄介です。それは単に出力を生成することを拒否し、私はすべてを失います.
このウェブサイトを読むと、宣言されていないエンティティは事前に宣言する必要があることが明らかになりましたが、私の仕事の性質を考えると、これは不可能であることに気付くでしょう (私は神のためにウェブをスクレイピングしています)。
を有効にしました
var_dump(libxml_use_internal_errors(true));
しかし、それが私の端末を乱雑にしないという事実を超えて、それはまったく役に立ちません。まず、このエラーをどのように処理するか、またはそのエラーに関するドキュメントはありません。
誰かがこの問題に遭遇したのはこれが初めてではないことを私は理解しています.解決策がそこにあると確信しています.私はそれを見つけることができないようです. 何千人もの人々が正規表現を使用して html や xml を解析しないように警告していますが、私が直面しているようなパーサーで直面する問題の解決策を持っている人はほとんどいません。
乾杯、リチャード - 不満を持った HTML パーサー愛好家。
EDIT:いくつかの追加情報 - >これは私が使用しているtidy関数です。
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);
}