【问题标题】:DOMXPath Query for a dynamic HTMLDOMXPath 查询动态 HTML
【发布时间】:2012-12-20 06:46:17
【问题描述】:

假设我有这个来自源的 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 上的空值?

完整代码

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;
    }
}

【问题讨论】:

  • 等等,你得到的是 span 吗?您使用什么来创建该查询?您使用的是 simplexml 还是其他内置解析器之一?
  • 我正在使用 xpath 查询..是的。我不知道为什么它会获取 span 的值..
  • 通过which one of the thirteen different XML extensions? DOM? XML解析器?简单XML?向我们展示您用于定义$xpath 的代码。
  • 我正在使用 DOM XPath..对不起,我很困惑..
  • 您的 $query_results 或表中仅获得 -0.4%?

标签: php xpath domxpath


【解决方案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::*

【讨论】:

    【解决方案2】:

    您的 XPath 匹配三个 td 元素,第一个包含 0.2%,然后是一个空的,最后一个包含 &lt;span class="revised worse" title="Revised From -0.3%"&gt;-0.4%&lt;/span&gt;

    您按顺序将这些节点的值(跳过空节点)分配给同一变量 table_values[$data_eventid][5] - 因此将包含最后一个(非空)节点的值 - 即 -0.4%

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2014-05-26
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多