0

<tr>メインのリモートページから取得したhtmlから特定のものを削除する際に問題に直面しています

問題は、html が無効であるか壊れていることです。私のコードは有効なテストでうまく動作します

フォーマットされたhtmlですが、リモートページのコードに関しては、しばらくすると機能しません

リモートページのhtmlコードが無効であることが判明した場合の実験

ここに私のコードがあります:

<?php
    //Get the url
    $url = "http://lsh.streamhunter.eu/static/section0.html";
    $html = file_get_contents($url);
    $doc = new DOMDocument(); // create DOMDocument
    @$doc->loadHTML($html); // load HTML you can add $html
    $xpath = new DOMXpath($doc);
    $elements = $xpath->query("//td[contains(., 'desktop')]"); // search td's that contain 'desktop'

    foreach($elements as $el){
        $parent = $el->parentNode;
        $parent->parentNode->removeChild($parent); // remove TR
        //$parent->removeChild($el); // remove TD
    }

    echo $doc->saveHTML(); // save new HTML
?>

適切にフォーマットされたhtmlでテストするとうまくいきますが、常に500内部サーバーエラーが発生しますか?

上記のコードに欠けているものはありますか? この問題に対処するための提案はありますか?

4

1 に答える 1

0

parentNode問題は、TR を削除すると、次の TD が孤立し、プロパティがもう存在しないノードを参照しているため、おそらくそのエラーが発生することです。

代わりにこれを行います:

$toRemove = array();

// gather a list of TRs to remove
foreach($elements as $el)
  if(!in_array($el->parentNode, $toRemove, true))
    $toRemove[] = $el->parentNode;

// remove them
foreach($toRemove as $tr)
  $tr->parentNode->removeChild($tr);

また、検証の警告を抑制するには、次を追加します。

libxml_use_internal_errors(true);

@HTMLをロードする前に(そして演算子を削除してください)。

于 2013-05-12T20:51:30.820 に答える