Я хотел бы извлечь из общей HTML-страницы весь текст (отображается или нет).
Я хочу удалить
- любые теги HTML
- Любой javascript
- Любые стили CSS
Есть ли регулярное выражение (одно или несколько), которое достигнет этого?
Я хотел бы извлечь из общей HTML-страницы весь текст (отображается или нет).
Я хочу удалить
Есть ли регулярное выражение (одно или несколько), которое достигнет этого?
Вы не можете разбирать HTML с регулярными выражениями. Это слишком сложно. RE не будет обрабатывать разделы <![CDATA[
правильно. Кроме того, некоторые виды общих HTML-вещей, таких как <text>
, будут работать в браузере как правильный текст, но могут озадачить наивный RE.
Вы будете счастливее и успешнее с правильным парсером HTML. Люди Python часто используют что-то Beautiful Soup, чтобы анализировать HTML и выделять теги и скрипты.
Кроме того, браузеры по дизайну допускают искаженный HTML. Таким образом, вы часто обнаружите, что пытаетесь проанализировать HTML-код, который явно не подходит, но, как правило, работает в браузере.
Возможно, вы сможете проанализировать плохой HTML с RE. Все это требует терпения и тяжелой работы. Но часто проще использовать чей-то парсер.
Удалить javascript и CSS:
<(script|style).*?</\1>
Удалить теги
<.*?>
Требуется решение регулярного выражения (в 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 этого не делал.
37 раз быстрее!
Созерцать это с помощью регулярных выражений сложно. Вы рассматривали XSLT? Выражение XPath для извлечения всех текстовых узлов в документе XHTML, минус script и содержимого стиля, будет:
//body//text()[not(ancestor::script)][not(ancestor::style)]
Здесь вы можете удалить даже самые сложные 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 );
}
Используя синтаксис perl для определения регулярных выражений, начало может быть:
!<body.*?>(.*)</body>!smi
Затем, применяя следующую замену к результату этой группы:
!<script.*?</script>!!smi
!<[^>]+/[ \t]*>!!smi
!</?([a-z]+).*?>!!smi
/<!--.*?-->//smi
Это, конечно, не будет хорошо форматировать текст как текстовый файл, но он вычеркивает весь HTML (в основном, есть несколько случаев, когда он может работать не совсем правильно). Лучше всего использовать парсер XML на любом языке, который вы используете для правильного анализа HTML-кода, и извлечь из него текст.
Если вы используете PHP, попробуйте простой HTML DOM, доступный в SourceForge.
В противном случае, Google html2text, и вы найдете множество реализаций для разных языков, которые в основном используют ряд регулярных выражений, чтобы высасывать всю разметку. Будьте осторожны, потому что иногда могут отсутствовать теги без окончаний, а также специальные символы, такие как и (который есть &).
Кроме того, следите за комментариями и Javascript, так как мне было особенно неприятно иметь дело с регулярными выражениями и почему я обычно предпочитаю, чтобы бесплатный парсер выполнял всю работу для меня.
Не уверен эта страница.
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
.
Я считаю, что вы можете просто сделать
document.body.innerText
Что вернет содержимое всех текстовых узлов в документе, видимое или нет.
[edit (olliej): sigh nevermind, это работает только в Safari и IE, и я не могу беспокоиться о загрузке firefox в ночное время, чтобы узнать, существует ли он в багажнике: -/]
Самый простой способ для простого 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'
Не можете ли вы использовать элемент управления 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);