2013-05-12 27 views
0

我面临的问题,从远程页面检索HTML删除某些<tr>无效HTML,主要删除某些<tr>来自破碎或基于关键字

问题是,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 
?> 

它总是给我500内部服务器错误, 虽然当我测试它以及HTML格式它运作良好?

有没有我在上面的代码中缺少的东西? 有没有解决这个问题的建议?

+0

如果您从PHP页面收到内部服务器错误,您需要检查服务器日志以找出实际的PHP错误。 (或打开错误报告) – Spudley 2013-05-12 21:06:38

回答

0

问题是,当你删除一个TR时,下一个TD将是孤儿,并且你可能会得到那个错误,因为parentNode属性引用了一个不再存在的节点。

而是执行此操作:

$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之前(和删除@运营商)。

+0

先生看到这个http://codepad.org/rrMdL4dh现在的代码应该是这样吗?是的,我仍然不工作 – 2013-05-12 21:04:50

+0

[试试这个](http://codepad.org/LoHRjGRg) – 2013-05-12 21:11:41

+0

是的这不会给内部服务器错误,但它会全部删除所有不仅包含我有桌面词我有不知道为什么? – 2013-05-12 21:18:10