【问题标题】:how to extract all text from HTML file using PHP?如何使用 PHP 从 HTML 文件中提取所有文本?
【发布时间】:2009-10-02 08:12:31
【问题描述】:

如何从 HTML 文件中提取所有文本

我想提取所有文本,在alt属性、

标签等中。

但是我不想提取样式和脚本标签之间的文本

谢谢

现在我有以下代码

    <?PHP
    $string =  trim(clean(strtolower(strip_tags($html_content))));
    $arr = explode(" ", $string);
    $count = array_count_values($arr);
    foreach($count as $value => $freq) {
          echo trim ($value)."---".$freq."<br>";
    }

    function clean($in){
           return preg_replace("/[^a-z]+/i", " ", $in);
    }

    ?>

这很好用,但它会检索我不想检索的脚本和样式标签 另一个问题我不确定它是否会检索像 alt 这样的属性 - 因为 strip_tags 函数可能会删除所有 HTML 标签及其属性

谢谢

【问题讨论】:

  • 使用正则表达式查找您的内容,而不是使用它进行清理。
  • 您是否有要从中提取文本的标签和属性的“白名单”或不想从中提取文本的标签/属性的“黑名单”?
  • @Ghommey:谢谢,我正在努力,但对我来说太难了
  • @VolkerK:我不是全部,但我已经提到了其中一些,-黑白名单-我的目标是创建一个搜索引擎,所以我想提取文档中的所有文本让我的搜索引擎搜索文本

标签: php html regex parsing html-content-extraction


【解决方案1】:

我个人认为您应该切换到某种 XML 阅读器(SimpleXMLDocument Object ModelXMLReader)来解析 HTML 文档。我会混合使用DOMSimpleXMLXPath 来提取你需要的东西——解析任意文档时,其他任何东西都会惨遭失败:

$dom = new DOMDocument();
$dom->loadHTML($html_content); // use DOMDocument because it can load HTML
$xml = simplexml_import_dom($dom); // switch to SimpleXML because it's easier to use.
$pTags = $xml->xpath('/html/body//p');
$tagsWithAltAttribute = $xml->xpath('/html/body//*[@alt]');
// ...

【讨论】:

  • 我也会选择这个解决方案。但是,如果 HTML 内容本身无效(有损坏的标签等),它会中断
  • 你是对的 - 但是使用字符串和正则表达式函数构建一个解析器来处理任意的和可能的格式错误或无效的文档将会复杂得多。一种解决方案是在将 HTML 字符串传递给 XML 阅读器之前,通过 HTML Tidy (de3.php.net/manual/en/book.tidy.php) 运行 HTML 字符串。如果 OP 将解析众所周知的结构化 HTML(始终相同的结构),他可能应该选择正则表达式解决方案。
  • @Stefan Gehrig:谢谢,这会很好,但我会尝试知道如何获取所有文本,而不仅仅是“alt”——它比正则表达式更容易和更安全
  • 除非您使用 XHTML(由于各种原因,这是一个坏主意)或 XHTML 兼容的 HTML(这几乎没有意义),否则文档将永远不会是格式良好的 XML(除非源不包含元标记,没有链接,没有图像......)。如果您需要这种级别的清洁度,最好使用成熟的 HTML 消毒剂。
  • @Alan:这就是我们使用DOMDocument::loadHTML() 方法的原因。它可以处理纯 HTML,并且不需要 XHTML 来构建 DOM 树。但是它不能处理无效的 HTML 文档...
【解决方案2】:

首先删除包含完整内容的脚本和样式标签,然后使用您当前清理标签的方式,您将获得文本。

【讨论】:

    【解决方案3】:

    首先您可以搜索 and 块并将它们从 html 中删除。

    我有这个功能我经常使用

            function search($start,$end,$string, $borders=true){
                $reg="!".preg_quote($start)."(.*?)".preg_quote($end)."!is";
                preg_match_all($reg,$string,$matches);
    
                if($borders) return $matches[0];    
                else return $matches[1];    
            }
    

    该函数将返回数组中的匹配块。

    $array = search("<script>" , "</script>" , $html)
    

    脚本和样式消失后,使用 strip_tags 获取文本

    【讨论】:

    • 除非您的脚本和样式标签使用 95% 的类型属性,否则这将不起作用。
    • 这是一个例子,你可以使用 search("
    【解决方案4】:

    只要您不能确定源是 100% 格式良好的 XML(根据定义,HTML4 不是),任何类型的解析都不是一种选择。

    一个简单的 preg_replace 就足够了。类似的东西

    preg_replace('/<(script|style).*>.*<\/\1>/i', '', $html);
    

    应该足以用空字符串替换所有脚本和样式元素及其内容(即剥离它们)。

    但是,如果您想避免 XSS 攻击,您最好使用 HTML sanitiser 来规范化 HTML,然后去除所有错误代码。

    【讨论】:

      【解决方案5】:

      我将此作为另一个帖子的答案发布,但这里又是:

      我们刚刚在repustate.com 上推出了一个新的自然语言处理 API。使用 REST API(所以只使用 curl 就可以了),您可以清理任何 HTML 或 PDF 并只取回文本部分。我们的 API 是免费的,所以请随意使用。检查一下并将结果与​​ readability.js 进行比较——我想你会发现它们几乎 100% 相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-14
        • 2013-02-28
        • 2012-01-20
        • 1970-01-01
        • 2016-01-06
        • 2010-09-24
        • 1970-01-01
        相关资源
        最近更新 更多