2

ソースからこの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は複雑で、フォーマット方法に関係ないように見えますが、2番目の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;
    }
}
4

2 に答える 2

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%

すべてのノードの値が必要な場合は、それらをリストに追加するか、配列の異なる要素に配置する必要があります。

于 2012-12-21T19:19:48.070 に答える
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::*
于 2012-12-20T15:36:58.340 に答える