Подтвердить что ты не робот

Регулярное выражение для извлечения текста из HTML

Я хотел бы извлечь из общей HTML-страницы весь текст (отображается или нет).

Я хочу удалить

  • любые теги HTML
  • Любой javascript
  • Любые стили CSS

Есть ли регулярное выражение (одно или несколько), которое достигнет этого?

4b9b3361

Ответ 1

Вы не можете разбирать HTML с регулярными выражениями. Это слишком сложно. RE не будет обрабатывать разделы <![CDATA[ правильно. Кроме того, некоторые виды общих HTML-вещей, таких как &lt;text>, будут работать в браузере как правильный текст, но могут озадачить наивный RE.

Вы будете счастливее и успешнее с правильным парсером HTML. Люди Python часто используют что-то Beautiful Soup, чтобы анализировать HTML и выделять теги и скрипты.


Кроме того, браузеры по дизайну допускают искаженный HTML. Таким образом, вы часто обнаружите, что пытаетесь проанализировать HTML-код, который явно не подходит, но, как правило, работает в браузере.

Возможно, вы сможете проанализировать плохой HTML с RE. Все это требует терпения и тяжелой работы. Но часто проще использовать чей-то парсер.

Ответ 2

Удалить javascript и CSS:

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

Удалить теги

<.*?>

Ответ 3

Требуется решение регулярного выражения (в php), которое также вернет простой текст (или лучше) PHPSimpleDOM, только намного быстрее. Вот решение, с которым я столкнулся:

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, только намного, намного быстрее. Он также правильно обрабатывал элементы списка (теги li), где PHPSimpleDOM этого не делал.

Что касается скорости:

  • SimpleDom: 0.03248 сек.
  • RegEx: 0,00087 сек.

37 раз быстрее!

Ответ 4

Созерцать это с помощью регулярных выражений сложно. Вы рассматривали XSLT? Выражение XPath для извлечения всех текстовых узлов в документе XHTML, минус script и содержимого стиля, будет:

//body//text()[not(ancestor::script)][not(ancestor::style)]

Ответ 5

Здесь вы можете удалить даже самые сложные 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 );
    }

Ответ 6

Используя синтаксис perl для определения регулярных выражений, начало может быть:

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

Затем, применяя следующую замену к результату этой группы:

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

Это, конечно, не будет хорошо форматировать текст как текстовый файл, но он вычеркивает весь HTML (в основном, есть несколько случаев, когда он может работать не совсем правильно). Лучше всего использовать парсер XML на любом языке, который вы используете для правильного анализа HTML-кода, и извлечь из него текст.

Ответ 7

Если вы используете PHP, попробуйте простой HTML DOM, доступный в SourceForge.

В противном случае, Google html2text, и вы найдете множество реализаций для разных языков, которые в основном используют ряд регулярных выражений, чтобы высасывать всю разметку. Будьте осторожны, потому что иногда могут отсутствовать теги без окончаний, а также специальные символы, такие как и (который есть &).

Кроме того, следите за комментариями и Javascript, так как мне было особенно неприятно иметь дело с регулярными выражениями и почему я обычно предпочитаю, чтобы бесплатный парсер выполнял всю работу для меня.

Ответ 9

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

.

Ответ 10

Я считаю, что вы можете просто сделать

document.body.innerText

Что вернет содержимое всех текстовых узлов в документе, видимое или нет.

[edit (olliej): sigh nevermind, это работает только в Safari и IE, и я не могу беспокоиться о загрузке firefox в ночное время, чтобы узнать, существует ли он в багажнике: -/]

Ответ 11

Самый простой способ для простого 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'

Ответ 12

Не можете ли вы использовать элемент управления 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);