我在从远程页面(主(检索的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上测试它时,它工作得很好?
上面的代码中有我遗漏的东西吗?有什么解决这个问题的建议吗?
问题是,当您删除一个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之前(并删除@
运算符(。