我想提取,从一般HTML网页,所有文本(显示或不)。

我会喜欢 删除

  • 任何HTML tags
  • 任何javascript
  • 任何CSS风格

是否有一个定期表达(一个或更多),会实现?

有帮助吗?

解决方案

你不可能真正地分析HTML与普通的表达方式。这太复杂。重新就不会处理 <![CDATA[ 部分正确的。另外,某些种类的共同HTML喜欢的东西 &lt;text> 将工作中的浏览器为适当的文本,但可能挡一个天真的。

你会更幸福、更成功的一个适当HTML分析器。蟒蛇的人经常使用的东西 美丽的汤 分析HTML和条出标记和脚本。


此外,浏览器,通过设计,容忍格式错误HTML。所以你会经常发现自己设法解析HTML这显然是不正确的,但是发生在工作好在浏览器。

你可能能够分析坏HTML与重。它所需要的是耐心和辛勤工作。但它往往更易于使用其他人的分析程序。

其他提示

删除javascript和CSS:

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

删除标记

<.*?>

需要一个regex解决方案(在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明,只有快得多。它还处理的清单项目(李标签)妥善地,在那里PHPSimpleDOM没有。

作为速度:

  • SimpleDom:0.03248秒。
  • RegEx:0.00087秒。

37倍的速度!

在考虑这样做与正常的表情是艰巨的。你有没有考虑XSLT?XPath表中提取的所有文本中的节点XHTML文件,减脚本和风格的内容,将是:

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

使用perl语法用于定义的regex,一开始可能是:

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

然后应用如下替代结果,小组:

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

这当然不会格式的东西很好地作为一个文本文件,但它带出所有HTML(主要是,有一些情况下,它可能不完全正确的).一个更好的主意虽然是要使用XML parser在任何一种语言,用于分析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'

这里有一个功能,以消除,甚至最复杂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 );
    }

如果你使用PHP,试试简单HTML DOM,可在SourceForge.

否则,谷歌html2text,你会找到各种各样的实现对于不同的语言,基本上使用的一系列定期的表情来吸了所有的标记。这里要小心,因为标记没有结局,有时可以被留在,以及特殊人物,如&(其是&).

此外,观看了意见和Javascript,正如我已经发现这是特别令人讨厌的处理的规则表达,为什么我一般只是喜欢我的免费分析器做的所有工作对我来说。

也不确定 这页 可能会有帮助。

你就不能使用的网页浏览器控制提供C#?

        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);
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

这将返回的内容的所有文本中的节点的文件,可见或不可见。

[编辑(olliej): 叹息 算了,这只能在野生动物园和即,我不能打扰下载火狐夜间看到,如果它的存在在后备箱:-/]

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top