2013-05-13 115 views
1

我需要剥离HTML文档中的一些值和一些原始HTML。我想过使用XPath,但我无法让我的查询工作。PHP和XPath查询

这里是我想达到的目标:

<div class="unit-id"> 
    <div class="title"> 
     some title-1 
    </div> 

    <div class="another-class"> 
     another class 
    </div> 
    <p>segwegw1<p> 
    <p>segwegw1<p> 
    <p>segwegw1<p> 
    <p>segwegw1<p> 
    <ul> 
    <li>jfjfj</li> 
    <li>jfjfj</li> 
    <li>jfjfj</li> 
    </ul> 
</div> 


<div class="unit-id"> 
    <div class="title"> 
     some title-2 
    </div> 
    <div class="another-class"> 
     some other class 
    </div> 
    <p>segwegw2<p> 
    <p>segwegw2<p> 
    <p>segwegw2<p> 
    <p>segwegw2<p> 
</div> 


<div class="unit-id"> 
    <div class="title"> 
     some title-3 
    </div> 
    <div class="some-other-class"> 
     some other data 
    </div> 
    <p>segwegw3<p> 
    <p>segwegw3<p> 
    <p>segwegw3<p> 
    <p>segwegw3<p> 
</div> 

所以我想查询通过每个div一个单位ID级别迭代和带班的title返回divs的价值, HTML的其余部分,除了divs以外,还有p标签和ul这些特殊的单元ID分类为div,然后进行下一次迭代。

这可能吗?你能否给我提供一个如何编写这个查询的例子?有没有更好的方法来做到这一点?

+1

你有什么企图到目前为止,计算器是不是写你的代码,但更多的固定你有问题,你有没有代码来显示。 – Kivylius 2013-05-13 17:11:09

+0

我已经创建了查询来返回与类unit-id(查询(“//div [@ class ='unit-id']”)的div元素的集合,但是,然后我需要返回以下所有非div元素,直到下一个具有'unit-id'类的div。这个我很苦恼。有没有比使用xpath查询更好的方法? – daktau 2013-05-13 18:30:40

+0

@Jessica - 在StackOverflow中问过的一些最好的问题被问到而不会显示任何不成功的代码。查看此链接:http://meta.stackexchange.com/questions/122986/is-it-ok-to-leave-what-have-you-tried-comments – 2013-05-13 19:35:37

回答

2

此代码有点像你在找什么:

function get_content($data){ 
    $doc = new DOMDocument(); 
    //load HTML string into document object 
    if (! @$doc->loadHTML($data)){ 
     return FALSE; 
    } 
    //create XPath object using the document object as the parameter 
    $xpath = new DOMXPath($doc); 
    $query = "//div[@class='unit-id']"; 
    //XPath queries return a NodeList 
    $res = $xpath->query($query); 
    $out = array(); 
    foreach ($res as $key => $node){ 
     //subquery 
     $sub = $xpath->query('.//div[@class="title"]', $node); 
     $out[$key]['title'] = trim($sub->item(0)->nodeValue); 
     foreach ($node->getElementsByTagName('p') as $key2 => $value){ 
      $out[$key]['par'][$key2] = $value->nodeValue; 
     } 
     foreach ($node->getElementsByTagName('li') as $key2 => $value){ 
      $out[$key]['list'][$key2] = $value->nodeValue; 
     } 
    } 
    return $out; 
} 

请注意,你有你的HTML错误。您正在关闭段落标记应该有尾部斜杠</p>

下面是输出:

array 
    0 => 
    array 
     'title' => string 'some title-1' (length=12) 
     'par' => 
     array 
      0 => string 'segwegw1' (length=8) 
      1 => string 'segwegw1' (length=8) 
      2 => string 'segwegw1' (length=8) 
      3 => string 'segwegw1' (length=8) 
     'list' => 
     array 
      0 => string 'jfjfj' (length=5) 
      1 => string 'jfjfj' (length=5) 
      2 => string 'jfjfj' (length=5) 
    1 => 
    array 
     'title' => string 'some title-2' (length=12) 
     'par' => 
     array 
      0 => string 'segwegw2' (length=8) 
      1 => string 'segwegw2' (length=8) 
      2 => string 'segwegw2' (length=8) 
      3 => string 'segwegw2' (length=8) 
+0

太好了,这对我很有帮助出。它在最初的查询上做了一个子查询,令我感到困惑。干杯! – daktau 2013-05-15 09:20:35