Доступ к содержимому дочернего абзаца с помощью XPath

HTML:

<div class = "b-list-fact__item-explanation js-fact-explanation">
    <p>Text 1 Text 1 Text 1 Text 1 Text 1 Text 1</p>
    <p>Text 2 Text 2 Text 2 Text 2 Text 2 Text 2 </p>
</div>

Я пытаюсь получить доступ к тексту внутри абзацев и объединить все p в одну строку.

Пробовал с кучей вариантов, например:

PHP (работает на 7.1.11):

    $html = file_get_contents('https://...');
    $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
    $dom = new DOMDocument;
    @$dom->loadHTML($html);

    $finder = new DomXPath($dom);
    $facts = $finder->query("//a[contains(@class, normalize-space('b-list-fact__item-text'))]");
    $long_fact = $finder->query("//*[contains(@class, 'b-list-fact__item-explanation js-fact-explanation')]/p");

    foreach ($facts as $key => $fact) {
            $fact_description = $long_fact[$key]->textContent;
            $fact = trim($fact->textContent);
            $dataArr[] = str_replace("\n", " ", $fact);
            array_push($dataArr, $fact_description);
    }

$long_fact = $finder->query("//*[contains(@class, 'b-list-fact__item-explanation js-fact-explanation')]/p");

$long_fact = $finder->query("//*[contains(@class, 'b-list-fact__item-explanation js-fact-explanation')]//p[1]");

$long_fact = $finder->query("//*[contains(@class, 'b-list-fact__item-explanation js-fact-explanation')]/p/text()");

if ($long_fact->length)
        {
            var_dump($long_fact[0]->textContent);
        }

if ($$long_fact->length)
        {
            var_dump($long_fact->textContent);
        }

if ($$long_fact->length)
        {
            var_dump($long_fact->nodeValue);
        }

И как еще 30 вариаций ...

Я совершенно не понимаю, почему это может произойти, другие варианты, которые не включают теги p, работают нормально.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
$ptext = $finder->query('//div[contains(@class, "b-list-fact__item-explanation js-fact-explanation")]/p');
$paragraphs = [];
foreach ($ptext as $paragraph) {
    $paragraphs[] = $paragraph->textContent;
}
$combined = implode("\n", $paragraphs);

В качестве альтернативы просто:

$ptext = $finder->query('//div[contains(@class, "b-list-fact__item-explanation js-fact-explanation")]')
    ->item(0)->textContent;

Теперь там написано: string(72) " "

Ricardo 19.05.2018 23:38

Я думаю, это связано с тем, что мы не получили доступ к p внутри div, а теперь пытаемся получить доступ к текстовому значению самого div? Я уже столкнулся с той же проблемой.

Ricardo 19.05.2018 23:44

На этом сайте, на котором я проводил тесты, есть теги <p> внутри атрибута data-html диапазона, который я не видел при просмотре исходного кода с помощью Chrome Dev Tools. Ваш код работает, спасибо за помощь!

Ricardo 20.05.2018 11:22

Другие вопросы по теме