Как сформулировать универсальное выражение для XPath?

Пытаюсь вытащить количество просмотров с Avito. Обнаружил два варианта:

1) https://www.avito.ru/novocherkassk/sport_i_otdyh/x...
<div class="item-views">
    <!--noindex-->
    Просмотров: 
    <span class="js-show-stat pseudo-link" data-config="{ &quot;type&quot;: &quot;item&quot;, &quot;url&quot;: &quot;/items/stat/562148872&quot; }">всего&nbsp;121, сегодня&nbsp;23</span>
    <!--/noindex-->
</div>

В div присутствует span, XPath выглядит так:
//*[@id="item"]//div[@class="item-views"]/span/text()


2) https://www.avito.ru/rostov-na-donu/telefony/remes...
<div class="item-views">
    <!--noindex-->
    Просмотров: всего&nbsp;20, сегодня&nbsp;20
    <!--/noindex-->
</div>

Текст идёт сразу в div, а span отсутствует => XPath:
//*[@id="item"]//div[@class="item-views"]/text()

Как написать универсальный XPath, отрабатывающий в обоих случаях?
  • Вопрос задан
  • 606 просмотров
Решения вопроса 2
adugin
@adugin Автор вопроса
Похоже, что вот такой способ работает. Не уверен в корректности:
//*[@id="item"]//div[@class="item-views"]|/span
Ответ написан
glebovgin
@glebovgin
Full Stack Web Developer
Не нужно насиловать DOM-дерево, подойдет в обоих случаях такой вариант
$views = $xpath->query('//div[@class="item-views"]');
echo $views->item(0)->nodeValue; // независимо от наличия span тут будет значение

На выходе будет значение «Просмотров: всего 120, сегодня 5», так что если нужны будут чистые цифры, то preg_match() в помощь (если речь о php, например).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Привет!

Попробуй так:
(//*[@id="item"]//div[@class="item-views"] | //*[@id="item"]//div[@class="item-views"]/span)/text()


Вроде работает...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы