2011-08-09 19 views
1

我正在使用DOMDocument解析一个html文档并从中获取一些数据。以下是DOM的子树的结构如何有选择地删除DOM文档的子树中的节点?

<div id="tab1"> 
    <div class="some class name"></div> 
    <div class="some other class name">arbitrary data and nodes</div> 
    <p> lot of paragraphs to follow </p> 
    <p> paragraphs </p> 
    <p> paragraphs </p> 
    <p> paragraphs </p> 
    <p> paragraphs </p> 
    <br /> 
    <br /> 
    <br /> 
    <br /> 
    <br /> 
    <table /> 
    <table /> 
    <table /> 
    <table /> 
</div> 

我不想要tab1的前两个孩子。我使用下面的PHP代码

<?php 
$urlArray = file('sitemap.txt'); 
$dataSet = array(); 
foreach($urlArray as $url){ 
    $scrapedData = file_get_contents('./scraped-site/'.trim($url)); 
    $doc = new DOMDocument(); 
    @$doc->loadHTML($scrapedData); 
    $domXpathDoc = new DOMXPath($doc); 
    $results = ''; 
    $xpathArray = array(
     'info'=>'//*[@id="tabs1"]', 
    ); 
    $set = array(); 
    foreach($xpathArray as $field => $xpath){ 
     $domNodeList = $domXpathDoc->query($xpath); 
     foreach($domNodeList as $node){ 
      foreach ($node->childNodes as $child) { 
       $set[] = $child->ownerDocument->saveXML($child); 
      } 
     } 
    } 
    $dataSet[] = $set; 
} 

给出的代码给了我所有的孩子我怎么能选择性地避免任何节点?

+0

你只是希望删除第一个两个孩子? – BumbleShrimp

+0

@JonathonG,在你看到的结构中,我只想删除前两个元素,但在其他一些情况下可能会有所不同。 – Kumar

回答

1

[EDIT2:我试过如下(我学:))答案。这是为我工作:

"//*[@id='tabs1'][name() != 'div']" 

基本上它告诉XPath来忽略名为“格”的所有元素。您可以忽略这样一个以上的元素:

"//*[@id='tabs1'][name() != 'div' and name() != 'foo']" 

只显示前两个元素后,将工作是这样的:

"//*[@id='tabs1'][position()>2]" 
+0

我不明白你的意思:(你能提供一些线索? – Kumar

+0

我第一次给了一个不正确的答案,我是因为我还没有找到正确的一个并没有消除。相反,我成立了一个通知,说明这不是一个正确的我现在找到了一个正确的答案,所以我删除了所有不正确的行。这应该是现在:) – hoppa

+0

哈哈,我已经尝试了将近30分钟了。谢谢hoppa。 – BumbleShrimp