【问题标题】:How to format plaintext in PHP Simple HTML DOM Parser?如何在 PHP Simple HTML DOM Parser 中格式化纯文本?
【发布时间】:2019-06-12 21:44:43
【问题描述】:

我正在尝试以纯文本格式提取网页内容 - 没有 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 时会出现问题,因为它会添加父级的内容,其中包括来自所有子级的文本,然后添加子级的内容,从而有效地复制文本。这可以通过检查$text 中是否有&lt;/div&gt; 来解决。

也许我应该试试callbacks

【问题讨论】:

  • 你的问题有点不清楚。通过删除 HTML 标记,您以某种方式从文本中删除了格式,但您实际上需要某种其他类型的格式,您需要以更精确的方式定义这些格式。您想对文本应用什么样的操作?你想要的输出是什么?
  • 我添加了一个示例以进行说明

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


【解决方案1】:

可能是这样的?经过测试。

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

【讨论】:

  • 回答了最初的问题,虽然还有一些细微的差别,比如嵌套的 div,这不能很好地处理,但这不是原始 HTML 示例的一部分,因此可以考虑超出范围。
  • 对于嵌套的 Div,您可以在数组映射中添加嵌套的 array_map 并执行相同的操作。
【解决方案2】:

试试这个代码:

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

【讨论】:

  • 它会产生这样的结果:“标题这是一个段落这是另一个段落。”
  • 你可以得到所有的div作为数组元素
  • @cohaven 我认为我更新的代码会对你有所帮助
猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多