XPATH в php

$doc = new \DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$xpath->query($query);
Получение html строки
$content = $xpath->query("//div[@id='test']/div[@class='content']")->item(0);
$html = $doc->saveHTML($content);// - получить html выбранного узла ($content)
Получение первого найденного элемента
$xpath->query("//div[@id='test']/div[@class='content']")[0];
OR
$xpath->query("//div[@id='test']/div[@class='content']")->item(0);
Получение списка
$xpath->query("//div[@id='test']/ul[@class='list']/li");
По классу
div[@class='name']
Class содержит
div[contains(@class, 'CLASS')]
Любой вложенности
//div
Атрибут
div/attribute::href
div/@href
Получение разных элементов, чз или
div[@id='details']/p|ul
Следующий элемент
td/following-sibling::td
Предыдущий элемент
td/preceding-sibling::td
Контент равен
td[normalize-space(text())='Description:']
Контент содержит
div[contains(text(), 'Description:')]
Нужно получить текст "Sell" - т.е. без дочерних элементов

<li>
<strong>Listing Type :</strong>
Sell
</li>
<li>
.....
</li>

1) li/strong[normalize-space(text())='Listing Type :']/parent::li/text()[normalize-space()]
2) li/strong[normalize-space(text())='Listing Type :']/following-sibling::text()

Второй вариант более простой в данном случае


Поиск относительно ранее подготовленного элемента обёртки - для оптимизации, компактности кода - поиск начинается с первого дочернего элемента
$params = $en_xpath->query("//div[@id='details']")->item(0);
$str = $en_xpath->query("li/div[@id='price']", $params)->item(0);
        
Получение последнего элемента списка
//div[@class='pagination-wrap']//ul/li[last()]/a/attribute::href

Последний элемент плюс дальнейший отбор
//div[@class='pagination-wrap']//ul/li[@class='page-item'][last()]/a[@class='page-link']/attribute::href
Предпоследний элемент
//ul[@class='pagination']/li[last()-1]
Первый
//ul[@class='pagination']/li[1]
Ссылки:
https://onedev.net/post/458
https://www.w3schools.com/xml/xpath_syntax.asp