PHP ganon dom解析器在找到匹配时获取下一个元素

时间:2013-04-27 21:30:57

标签: php dom html-parsing ganon

我正在从ganon dom解析器解析和html dom字符串,并希望在前一个元素上找到匹配时获取下一个元素纯文本,例如我的html就像

<tr class="last even">
   <th class="label">SKU</th>
   <td class="data last">some sku here i want to get </td> 
</tr>

我现在使用以下代码

$html = str_get_dom('html string here');
foreach ($html('th.label') as $elem){
                if($elem->getPlainText()=='SKU'){ //this is right
                    echo $elem->getSibling(1)->getPlainText(); // this is not working
                }
            }

如果找到带有lable类和innerhtml SKU 的th,那么从下一个兄弟那里获取 SKU值

的innerhtml

请帮忙解决这个问题。

1 个答案:

答案 0 :(得分:3)

这可能是html“ganon”中的一个错误 - 如果你以你的html为例:

$html = '<table>
                <tr class="last even">
                   <th class="label">SKU</th>
                   <td class="data last">some sku here i want to get </td> 
                </tr>
            </table>';

   $html = str_get_dom($html); 

由于某种原因,因为html“ganon”中的新行认为下一个元素是一个文本元素,只有那时才有了欲望td - 所以你必须这样做:

   foreach ($html('th.label') as $elem){
        if($elem->getPlainText()=='SKU'){ 
            //elem -> text node -> td node
            echo($elem->getSibling(1)->getSibling(1)->getPlainText()); 
        }
    }

如果你像这样组织你的html(没有换行):

$html = '<table>
                <tr class="last even">
                   <th class="label">SKU</th><td class="data last">some sku here i want to get </td> 
                </tr>
            </table>';

然后您的原始代码将有效$elem->getSibling(1)->getPlainText()

也许考虑使用php simple html dom类 - 它更直观,使用完整的oop方法,类似jquery dom解析器,并且不使用这个糟糕的var函数方法:):

require('simple_html_dom.php');

    $html = '<table>
                <tr class="last even">
                   <th class="label">SKU</th>
                   <td class="data last">some sku here i want to get </td> 
                </tr>
            </table>';

   $dom = str_get_html($html); 


   foreach($dom->find('th.label') as $el){
       if($el->plaintext == 'SKU'){  
            echo($el->next_sibling()->plaintext);
       }
   }