2013-04-05 45 views
0
<div class="date"> 
    <div class="rating">good</div> 
    Movie Review - Mar 24, 2013 
</div> 

<div class="date"> 
    Movie Review - Mar 23, 2013 
</div> 

什么xpath查询将获得“电影评论..”部分没有评级div内容(它说的很好)。有时评级股有时并不存在。我怎样才能得到一个没有子div文本数据的div的文本数据 - 用php xpath?

我想这样的事情时,我得到一个div节点到$reviewnode:

$thedate = $xpath->query('text()[1]',$reviewdate)->item(0) ; 

但它也抓住了得分的div内容。

解析后的doc是html5。

+0

我不知道如何有时捕捉评分div。您可能想要检查如何获取所有'$ reviewdate'上下文节点。 – hakre 2013-04-08 11:46:57

回答

1

这应返回的div文本孩子包含字符串‘电影’:

//div[@class = "date"]/text()[contains(., "Movie")] 

如果你只是想在第一个非空白文本节点,你可以使用

//div[@class = "date"]/text()[normalize-space(.) != ''][1] 
+0

这工作,但我可以做到这一点,而无需引用div中的文本 - 例如,我可能不知道文本将在那里 - 在父母或子div。 Thnaks – 2013-04-05 16:56:50

+0

@Calgacus:查看更新。 – choroba 2013-04-05 23:29:49

+0

正常化空间的东西似乎是我需要的,谢谢! – 2013-04-11 18:34:48

0

你正在寻找不是仅限空白节点的第一个文本节点子节点:

// xpath: text()[normalize-space(.)][1] 

$thedate = $xpath->query(
    'text()[normalize-space(.)][1]', $reviewdate 
)->item(0); 

结果(var_dump($thedate->data)):

string(39) "\n  Movie Review - Mar 24, 2013\n " 
string(39) "\n  Movie Review - Mar 23, 2013\n " 

此外,你正在寻找一个值,你可能想直接检索字符串值:

// xpath: normalize-space(text()[normalize-space(.)]) 

$thedate = $xpath->evaluate(
    'normalize-space(text()[normalize-space(.)])', $reviewdate 
); 

结果(var_dump($thedate)):

string(27) "Movie Review - Mar 24, 2013" 
string(27) "Movie Review - Mar 23, 2013" 

我希望这是有帮助的。请参阅Online Demo以及完整的代码示例:

<?php 
/** 
* how can I get the text data of a div without the child divs text data - with php xpath? 
* 
* @link http://stackoverflow.com/q/15838487/367456 
* @link http://eval.in/15474 
*/ 
$buffer = <<<BUFFER 
<html> 
    <div class="date"> 
     <div class="rating">good</div> 
     Movie Review - Mar 24, 2013 
    </div> 

    <div class="date"> 
     Movie Review - Mar 23, 2013 
    </div> 
</html> 
BUFFER; 

$doc = new DOMDocument(); 
$doc->loadHTML($buffer); 
$xpath = new DOMXPath($doc); 

foreach ($xpath->query('/*/body/div[@class = "date"]') as $reviewdate) { 
    $thedate = $xpath->query('text()[normalize-space(.)][1]', $reviewdate)->item(0); 
    var_dump($thedate->data); 

    // string: 
    $thedate = $xpath->evaluate('normalize-space(text()[normalize-space(.)])', $reviewdate); 
    var_dump($thedate); 
}