Доступ к содержимому дочернего абзаца с помощью XPath - PullRequest
0 голосов
/ 19 мая 2018

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, работают просто отлично.

1 Ответ

0 голосов
/ 20 мая 2018
$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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...