20

一般的なHTMLページから、すべてのテキスト(表示されているかどうかに関係なく)を抽出したいと思います。

削除したい

  • HTMLタグ
  • 任意のJavaScript
  • すべてのCSSスタイル

それを実現する正規表現(1つ以上)はありますか?

4

11 に答える 11

19

javascriptとCSSを削除します。

<(script|style).*?</\1>

タグを削除する

<.*?>
于 2008-10-08T01:53:36.973 に答える
14

HTML を正規表現で解析することはできません。複雑すぎます。RE は<![CDATA[セクションをまったく正しく処理しません。さらに、いくつかの種類の一般的な HTML のようなもの&lt;text>は、ブラウザーで適切なテキストとして機能しますが、単純な RE を困惑させる可能性があります。

適切な HTML パーサーを使用すると、より満足して成功することができます。Python 関係者は、HTML を解析してタグやスクリプトを削除するために、何かBeautiful Soupをよく使用します。


また、ブラウザーは、設計上、不正な形式の HTML を許容します。そのため、明らかに不適切な HTML を解析しようとしていることに気付くことがよくありますが、たまたまブラウザーでは問題なく動作します。

RE を使用すると、不適切な HTML を解析できる場合があります。必要なのは忍耐と努力だけです。しかし、多くの場合、他の誰かのパーサーを使用する方が簡単です。

于 2008-10-08T02:01:41.077 に答える
6

PHPSimpleDOM と同じくらい (またはそれよりも優れた) プレーンテキストを返す正規表現ソリューション ( php 内) が必要でしたが、はるかに高速でした。これが私が思いついた解決策です:

function plaintext($html)
{
    // remove comments and any content found in the the comment area (strip_tags only removes the actual tags).
    $plaintext = preg_replace('#<!--.*?-->#s', '', $html);

    // put a space between list items (strip_tags just removes the tags).
    $plaintext = preg_replace('#</li>#', ' </li>', $plaintext);

    // remove all script and style tags
    $plaintext = preg_replace('#<(script|style)\b[^>]*>(.*?)</(script|style)>#is', "", $plaintext);

    // remove br tags (missed by strip_tags)
    $plaintext = preg_replace("#<br[^>]*?>#", " ", $plaintext);

    // remove all remaining html
    $plaintext = strip_tags($plaintext);

    return $plaintext;
}

いくつかの複雑なサイト (フォーラムには解析が難しい HTML が含まれているようです) でこれをテストしたところ、このメソッドは PHPSimpleDOM プレーンテキストと同じ結果を返しましたが、はるかに高速でした。また、PHPSimpleDOM では処理されなかったリスト項目 (li タグ) も適切に処理されました。

速度に関しては:

  • SimpleDom: 0.03248 秒。
  • 正規表現: 0.00087 秒。

37倍速い!

于 2012-12-26T17:04:23.540 に答える
4

正規表現でこれを行うことを検討するのは困難です。XSLTを検討しましたか?スクリプトとスタイルのコンテンツを除いた、XHTMLドキュメント内のすべてのテキストノードを抽出するXPath式は次のようになります。

// body // text()[not(ancestor :: script)] [not(ancestor :: style)]
于 2008-10-08T01:53:11.373 に答える
2

正規表現を定義するためにperl構文を使用すると、開始は次のようになります。

!<body.*?>(.*)</body>!smi

次に、そのグループの結果に次の置換を適用します。

!<script.*?</script>!!smi
!<[^>]+/[ \t]*>!!smi
!</?([a-z]+).*?>!!smi
/<!--.*?-->//smi

もちろん、これはテキストファイルとして適切にフォーマットされませんが、すべてのHTMLを削除します(ほとんどの場合、正しく機能しない場合がいくつかあります)。ただし、HTMLを適切に解析し、そこからテキストを抽出するために使用している言語でXMLパーサーを使用することをお勧めします。

于 2008-10-08T01:51:37.210 に答える
2

単純な HTML の最も簡単な方法 (Python の例):

text = "<p>This is my> <strong>example</strong>HTML,<br /> containing tags</p>"
import re
" ".join([t.strip() for t in re.findall(r"<[^>]+>|[^<]+",text) if not '<' in t])

これを返します:

'This is my> example HTML, containing tags'
于 2010-04-21T19:04:39.117 に答える
2

これは、最も複雑な html タグを削除する関数です。

function strip_html_tags( $text ) 
{

$text = preg_replace(
    array(
        // Remove invisible content
        '@<head[^>]*?>.*?</head>@siu',
        '@<style[^>]*?>.*?</style>@siu',
        '@<script[^>]*?.*?</script>@siu',
        '@<object[^>]*?.*?</object>@siu',
        '@<embed[^>]*?.*?</embed>@siu',
        '@<applet[^>]*?.*?</applet>@siu',
        '@<noframes[^>]*?.*?</noframes>@siu',
        '@<noscript[^>]*?.*?</noscript>@siu',
        '@<noembed[^>]*?.*?</noembed>@siu',

        // Add line breaks before & after blocks
        '@<((br)|(hr))@iu',
        '@</?((address)|(blockquote)|(center)|(del))@iu',
        '@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu',
        '@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu',
        '@</?((table)|(th)|(td)|(caption))@iu',
        '@</?((form)|(button)|(fieldset)|(legend)|(input))@iu',
        '@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu',
        '@</?((frameset)|(frame)|(iframe))@iu',
    ),
    array(
        ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
        "\n\$0", "\n\$0", "\n\$0", "\n\$0", "\n\$0", "\n\$0",
        "\n\$0", "\n\$0",
    ),
    $text );

// Remove all remaining tags and comments and return.
return strip_tags( $text );
    }
于 2011-01-09T10:14:27.000 に答える
1

PHPを使用している場合は、SourceForgeで入手できるSimpleHTMLDOMを試してください。

それ以外の場合は、Google html2textを使用すると、基本的に一連の正規表現を使用してすべてのマークアップを吸い出す、さまざまな言語のさまざまな実装が見つかります。ここでは、末尾のないタグや、&(&amp;)などの特殊文字が残っている場合があるので注意してください。

また、コメントとJavascriptに注意してください。正規表現を扱うのは特に面倒であり、一般的に無料のパーサーにすべての作業を任せることを好む理由です。

于 2008-10-08T01:51:56.743 に答える
1

C#で使用できるWebBrowserコントロールを使用することはできませんか?

        System.Windows.Forms.WebBrowser wc = new System.Windows.Forms.WebBrowser();
        wc.DocumentText = "<html><body>blah blah<b>foo</b></body></html>";
        System.Windows.Forms.HtmlDocument h = wc.Document;
        Console.WriteLine(h.Body.InnerText);
于 2011-10-01T13:59:05.967 に答える
1

私はあなたがただできると信じています

document.body.innerText

これは、ドキュメント内のすべてのテキスト ノードのコンテンツを、表示されているかどうかにかかわらず返します。

[編集 (olliej):にしないで、これは Safari と IE でのみ機能します。トランクに存在するかどうかを確認するために毎晩 Firefox をダウンロードする必要はありません :-/ ]

于 2008-10-08T02:38:20.190 に答える
1
string decode = System.Web.HttpUtility.HtmlDecode(your_htmlfile.html);
                Regex objRegExp = new Regex("<(.|\n)+?>");
                string replace = objRegExp.Replace(g, "");
                replace = replace.Replace(k, string.Empty);
                replace.Trim("\t\r\n ".ToCharArray());

then take a label and do "label.text=replace;" see on label out put

.

于 2012-02-03T05:54:50.107 に答える