Как подражать селектору детей с помощью простого HTML DOM?
-
27-10-2019 - |
Вопрос
Фелли!
У меня есть одна неприятная страница для анализа, но я не могу понять, как извлечь из нее правильные блоки данных, используя ее Простой HTML Dom, потому что он не имеет поддержки детьми CSS.
HTML:
<ul class="ul-block">
<li>xxx</li>
<li>xxx</li>
<li>
<ul>
<li>xxx2</li>
</ul>
</ul>
Как я бы извлекла (прямую) ребенка li
Элементы родителя ul.ul-block
?
А $node->find('ul[class=ul-block] > li');
не работает и $node->find('ul[class=ul-block] li');
OFC находит также вложенную деклант li
Элементы :(
Решение
Простой пример с PHP Dom:
$dom = new DomDocument;
$dom->loadHtml('
<ul class="ul-block">
<li>a</li>
<li>b</li>
<li>
<ul>
<li>c</li>
</ul>
</li>
</ul>
');
$xpath = new DomXpath($dom);
foreach ($xpath->query('//ul[@class="ul-block"]/li') as $liNode) {
echo $liNode->nodeValue, '<br />';
}
Другие советы
У меня была такая же проблема, и я использовал метод детей, чтобы получить только предметы первого уровня.
<ul class="my-list">
<li>
<a href="#">Some Text</a>
<ul>
<li><a href="#">Some Inner Text</a></li>
<li><a href="#">Some Inner Text</a></li>
<li><a href="#">Some Inner Text</a></li>
<li><a href="#">Some Inner Text</a></li>
</ul>
</li>
<li>
<a href="#">Some Text</a>
<ul>
<li><a href="#">Some Inner Text</a></li>
<li><a href="#">Some Inner Text</a></li>
<li><a href="#">Some Inner Text</a></li>
<li><a href="#">Some Inner Text</a></li>
</ul>
</li>
</ul>
А вот простой код HTML DOM, чтобы получить только первые элементы LI:
$html = file_get_html( $url );
$first_level_items = $html->find( '.my-list', 0)->children();
foreach ( $first_level_items as $item ) {
... do stuff ...
}
Не связан с StackOverflow