2012-12-20 29 views
2

假设我有这样的HTML从源(再杀吧):DOMXPath查询的动态HTML

<tr class="calendar_row" data-eventid="41675"> 
    <td class="alt2 eventDate smallfont" align="center"/> 
    <td class="alt2 smallfont" align="center">9:00pm</td> 
    <td class="alt2 smallfont" align="center">AUD</td> 
    <td class="alt2 icon smallfont" align="center"> 
     <div class="cal_imp_medium" title="Medium Impact Expected"/> 
    </td> 
    <td class="alt2 eventHigh smallfont" align="center"> 
     <div class="calendar_detail level_1" data-level="1" title="Open Detail"/> 
    </td> 

    //I want to get this part below correctly 

    <td class="alt2 pad_left eventHigh smallfont" align="center">0.2%</td> 
    <td class="alt2 pad_left eventHigh smallfont" align="center"/> 
    <td class="alt2 pad_left eventHigh smallfont" align="center"> 
     <span class="revised worse" title="Revised From -0.3%">-0.4%</span> 
    </td> 
</tr>​ 

而且我想要得到的值(nodeValues)运输署通过的XPath:

$query = $xpath->query('//tr[@data-eventid="41675"]/td[@class="alt2 pad_left eventHigh smallfont"]'); 

我不能弄清楚为什么我只能得到值-0.4%。 尽管html看起来很复杂并且没有被格式化,但是有没有什么可能的方式(查询)来检索标签之间的值,包括第二个td上的空值?

全码

libxml_use_internal_errors(true); 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 

$query_results = $xpath->query('//tr[@data-eventid="'.$data_eventid.'"]/td[@class="alt2 pad_left eventHigh smallfont"]'); 
foreach($query_results as $values){ 
    if($values->nodeValue!=' ' and $values->nodeValue!='' and $values->nodeName!='#text') { //Discards Empty Arrays 
     $table_values[$data_eventid][5] = $values->nodeValue; 
    } 
} 
+0

等一下,你会得到* span *?你用什么来创建该查询?你在使用simplexml还是其他内置解析器? – Charles

+0

我正在使用xpath query..and yes.i不知道为什么它会得到span的值。 – Vainglory07

+0

通过[其中一个**十三个不同的XML扩展**](http://php.net/refs。 XML)? DOM? XMLParser的? SimpleXML的?向我们显示您用来定义'$ xpath'的代码。 – Charles

回答

1

试试这个://tr[@data-eventid="41675"]/td[@class="alt2 pad_left eventHigh smallfont"]/descendant-or-self::*/text()

那么你可能只是想的节点,所以取/text()关:

//tr[@data-eventid="41675"]/td[@class="alt2 pad_left eventHigh smallfont"]/descendant-or-self::* 
1

你的XPath与3个td元素时,首先包含0.2%,然后是空的,最后一个包含<span class="revised worse" title="Revised From -0.3%">-0.4%</span>

您指定的顺序,这些节点的值(跳过空的),以相同的变量table_values[$data_eventid][5] - 即这样将包含最后一个(非空)节点的值 - 即-0.4%

如果你想所有节点的值应该附加到列表中,或者将它们放置在数组的不同元素中。