假设我从源代码获取此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>
我希望通过XPath获取td的值(nodeValues):
$query = $xpath->query('//tr[@data-eventid="41675"]/td[@class="alt2 pad_left eventHigh smallfont"]');
我无法弄清楚为什么我只获得 -0.4%的值。 虽然html似乎很复杂,并且无论如何被格式化,但是有没有可能的方法(查询)来检索标记之间的值,包括第二个td上的null值?
完整代码
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 :(得分: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 :(得分:1)
您的XPath匹配三个td
元素,第一个包含0.2%
,然后是空元素,最后一个包含<span class="revised worse" title="Revised From -0.3%">-0.4%</span>
。
您按顺序将这些节点的值(跳过空节点)分配给同一个变量table_values[$data_eventid][5]
- 这将包含最后一个(非空)节点的值 - 即-0.4%
如果你想要所有节点的值,你应该将它们附加到列表中,或者将它们放在数组的不同元素中。