0

HTMLファイルからすべてのテキストを抽出する方法

alt 属性、 < p > タグなどのすべてのテキストを抽出したい.

ただし、スタイルタグとスクリプトタグの間のテキストを抽出したくありません

ありがとう

今、私は次のコードを持っています

    <?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 タグを削除する可能性があるためです。

ありがとう

4

5 に答える 5

7

個人的には、HTML ドキュメントを解析するには、ある種の XML リーダー ( SimpleXMLDocument Object Modelまたは) に切り替える必要があると思います。とXPathXMLReaderを組み合わせてDOM、必要なものを抽出します。それ以外は、任意のドキュメントを解析するときに惨めに失敗します。SimpleXML

$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]');
// ...
于 2009-10-02T08:29:15.443 に答える
0

ソースが 100% 整形式の XML (定義上、HTML4 はそうではありません) であることを確認できない限り、いかなる種類の解析もオプションではありません。

シンプルな preg_replace で十分です。何かのようなもの

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

すべてのスクリプト要素とスタイル要素、およびそれらの内容を空の文字列に置き換える (つまり、それらを削除する) には十分なはずです。

ただし、XSS 攻撃を回避したい場合は、HTML サニタイザーを使用して HTML を正規化し、悪いコードをすべて取り除く方がよいでしょう。

于 2009-10-02T08:43:45.430 に答える
0

最初にスクリプトとスタイル タグを完全なコンテンツで削除し、次にタグをクリーニングする現在の方法を使用すると、テキストが取得されます。

于 2009-10-02T08:26:39.253 に答える
0

これを別の投稿への回答として投稿しましたが、ここにもう一度:

repustate.comで新しい自然言語処理 API をローンチしました。REST API を使用すると (つまり、curl を使用するだけで問題ありません)、HTML または PDF をクリーンアップして、テキスト部分だけを取り戻すことができます。APIは無料ですので、思う存分ご利用ください。それをチェックして、結果を readability.js と比較してください。ほぼ 100% 同じであることがわかると思います。

于 2010-05-31T19:52:46.660 に答える
0

最初に および ブロックを検索して、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 を使用してテキストを取得します。

于 2009-10-02T08:33:32.533 に答える