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, работают нормально.






$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;
Я думаю, это связано с тем, что мы не получили доступ к p внутри div, а теперь пытаемся получить доступ к текстовому значению самого div? Я уже столкнулся с той же проблемой.
На этом сайте, на котором я проводил тесты, есть теги <p> внутри атрибута data-html диапазона, который я не видел при просмотре исходного кода с помощью Chrome Dev Tools. Ваш код работает, спасибо за помощь!
Теперь там написано:
string(72) " "