如何在PHP Simple HTML DOM解析器中设置纯文本格式?

时间:2019-01-18 15:41:02

标签: php html web-scraping simple-html-dom

我正在尝试以纯文本格式提取网页内容-不带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>

结果:

“标题这是一个段落,这是另一个段落”

所需结果:

“标题。这是一个段落。这是另一个段落”

在使用纯文本为句子实现清晰的定界符之前,是否有任何方法可以格式化纯文本的结果或对内部文本进行额外的处理?

编辑:

我正在考虑做这样的事情:

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

但是当div嵌套时会有一个问题,因为它将添加父级的内容(包括所有子级的文本),然后添加子级的内容,从而有效地复制了文本。只需检查</div>内是否有$text即可解决此问题。

也许我应该尝试callbacks

2 个答案:

答案 0 :(得分:1)

Try this code:

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

答案 1 :(得分:1)

Possibly something like this? Tested.

<?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