我正在从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请帮忙解决这个问题。
答案 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);
}
}