Как отформатировать открытый текст в PHP Simple HTML DOM Parser? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь извлечь содержимое веб-страницы в виде обычного текста - без тегов html. Вот пример кода:

$dom = \Sunra\PhpSimple\HtmlDomParser::file_get_html($url);
$result['body'] = $dom->find('body', 0)->plaintext;

Проблема в том, что то, что я получаю в $ result ['body'], очень грязно. Конечно, HTML был удален, но предложения часто объединяются в другие, так как нет пробелов или точек для разграничения, где заканчивается текст из одного тега HTML, и начинается текст из следующего тега.

Пример:

<body>
    <div class="H2">Header</div>
    <div class="P">this is a paragraph</div>
    <div class="P">this is another paragraph</div>
</body>

Результат:

«Заголовок это абзац, это другой абзац»

Желаемый результат:

«Заголовок. Это абзац. Это другой абзац»

Есть ли способ отформатировать результат с открытым текстом или, возможно, применить дополнительные манипуляции с внутренним текстом перед использованием открытого текста для получения четких разделителей для предложений?

EDIT:

Я думаю сделать что-то вроде этого:

foreach($dom->find('div') as $element) {
    $text = $element->plaintext;
    $result['body'] .= $text.'. ';
}

но есть проблема, когда div'ы вложены, так как это добавит содержимое родительского элемента, который включает в себя текст всех дочерних элементов, а затем добавит содержимое дочерних элементов, эффективно дублируя текст. Это можно исправить, просто проверив, есть ли </div> внутри $text.

Возможно, мне стоит попробовать обратные вызовы .

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Возможно как то так?Протестировано.

<?php
require_once 'vendor/autoload.php';

$dom = \Sunra\PhpSimple\HtmlDomParser::file_get_html("index.html");

$result['body'] = implode('. ', array_map(function($element) {
    return $element->plaintext;
}, $dom->find('div')));

echo $result['body'];
<body>
    <div class="H2">Header</div>
    <div class="P">this is a paragraph</div>
    <div class="P">this is another paragraph</div>
</body>

enter image description here

0 голосов
/ 18 января 2019

Попробуйте этот код:

$result = array();
foreach($html->find('div') as $e){
    $result[] = $e->plaintext;
}
...