Помогите разобраться с обходом дочерных элементов

вопросы и ответы по использованию PHP
Ответить
voronov9988
Сообщения: 5
Зарегистрирован: 06 май 2019, 16:57

Помогите разобраться с обходом дочерных элементов

Сообщение voronov9988 » 06 май 2019, 17:16

Подскажите как получить все данные дочерних элементов
Есть сайт с таким html кодом

Код: Выделить всё

<ul>
<li class="serp-item">
	<div class="organic ...">
		<h2>
			<div class="test"></div>
			<a class="link ..." href="...">Ссылка 1</a>
		</h2>
		<div class="organic2 ...">
			<div class="organic3 ...">
				<a class="link ..." href="...">Ссылка 2
					<b>text</b>
				</a>
			</div>
		</div>
	</div>
</li>

еще N количество li
</ul>
Нужно циклом обойти все li.serp-item и получить
1. адрес первой ссылки
2. Узнать есть ли в данном элементе li тег <div class="test"></div>
3. Найти текст внутри <b>text</b>

Положение элементов может меняться, поэтому просто по номеру в dom их особо не спарсишь

Пробовал сделать так

Код: Выделить всё

$lis = $li->get_all_by_attribute("class", "serp-item", true);
foreach ($lis as $v) {
	$link = $v->get_child_by_attribute("class", "link", true);
}
но при обходе внутренних элементов, ничего не находит

Аватара пользователя
bigfozzy
Site Admin
Сообщения: 3047
Зарегистрирован: 28 июл 2008, 17:24
Контактная информация:

Re: Помогите разобраться с обходом дочерных элементов

Сообщение bigfozzy » 06 май 2019, 18:19

попробуйте как вариант разбор через строку (суффикс и префикс + якоря + смещения) или воспользоваться любым из HTML парсеров: https://tproger.ru/digest/parse-html-via-php/

foreach ($lis as $v) {
	$inner_html = $v->get_inner_html();
        // parse inner html
}
ну или :

// получить адрес ссылки
$link_href = $v->get_child_by_attribute("class", "link", true, true)->get_attribute("href"); - последний параметр - сделать обход всех дочерних а не только дочерних первого уровня

Аватара пользователя
Support
Site Admin
Сообщения: 1000
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Помогите разобраться с обходом дочерных элементов

Сообщение Support » 06 май 2019, 20:59

Так же учтите вот какой момент. При вызове функций типа get_all_by_* вы получаете не массив элементов, а объект типа XHEInterfaces. Этот объект содержит следующие поля:
XHEInterfaces Object
(
[inner_numbers] => 
[elements] => Array
(
)

[server] => 
[password] => 
)
Таким образом что бы получить доступ непосредственно к элементам вам нужно делать так:

$lis = $li->get_all_by_attribute("class", "serp-item", true);
foreach ($lis->elements as $v) {
	$link = $v->get_child_by_attribute("class", "link", true);
}

Ответить