문제

일반 HTML 페이지에서 모든 텍스트 (표시 여부)에서 추출하고 싶습니다.

나는하고 싶다 제거하다

  • 모든 HTML 태그
  • 모든 JavaScript
  • 모든 CSS 스타일

그것을 달성 할 정규 표현 (하나 이상)이 있습니까?

도움이 되었습니까?

해결책

정규 표현식으로 HTML을 실제로 구문 분석 할 수는 없습니다. 너무 복잡합니다. Re 's는 처리하지 않습니다 <![CDATA[ 섹션은 전혀 올바르게 있습니다. 또한, 어떤 종류의 일반적인 HTML과 같은 것들 &lt;text> 브라우저에서 적절한 텍스트로 작동하지만 순진한 re.

적절한 HTML 파서로 더 행복하고 성공할 것입니다. 파이썬 사람들은 종종 무언가를 사용합니다 아름다운 수프 HTML을 구문 분석하고 태그와 스크립트를 제거합니다.


또한 브라우저는 설계에 의해 오르플 란드 HTML을 견딜 수 있습니다. 따라서 종종 자신이 분명히 부적절하지만 브라우저에서 괜찮은 HTML을 구문 분석하려고합니다.

RE와 함께 나쁜 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 PlainText와 동일한 결과를 훨씬 더 빠르게 반환했습니다. 또한 phpsimpledom이하지 않은 목록 항목 (Li Tags)을 올바르게 처리했습니다.

속도는 :

  • 단순함 : 0.03248 초.
  • Regex : 0.00087 Sec.

37 배 더 빠릅니다!

정기적 인 표현으로 이것을하는 것을 고려하는 것은 어려운 일입니다. XSLT를 고려해 보셨습니까? XHTML 문서에서 모든 텍스트 노드를 추출하는 XPath 표현식은 다음과 같습니다.

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

Regexes를 정의하기 위해 Perl Syntax를 사용하면 다음과 같습니다.

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

그런 다음 다음 교체를 해당 그룹의 결과에 적용하십시오.

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

물론 이것은 텍스트 파일로 멋지게 형식화되지는 않지만 모든 HTML을 벗겨냅니다 (대부분 작동하지 않을 수있는 몇 가지 경우가 있습니다). 그러나 더 나은 아이디어는 HTML을 올바르게 구문 분석하고 텍스트를 추출하기 위해 사용하는 언어로 XML 파서를 사용하는 것입니다.

간단한 HTML의 가장 간단한 방법 (파이썬의 예) :

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를 사용하는 경우 Sourceforge에서 사용할 수있는 간단한 HTML DOM을 사용해보십시오.

그렇지 않으면 Google HTML2Text는 기본적으로 일련의 정규 표현식을 사용하여 모든 마크 업을 빨아들이는 다양한 언어에 대한 다양한 구현을 찾을 수 있습니다. 결말이없는 태그는 때때로 &와 같은 특수 문자를 남길 수 있기 때문에 여기에서주의하십시오.

또한 의견과 JavaScript를 조심하십시오. 정기적 인 표현을 다루는 것이 특히 성가신 일이라는 것을 알았으며, 일반적으로 무료 파서가 저를 위해 모든 작업을 수행하는 것을 선호하는 이유입니다.

확실하지도 않습니다 이 페이지 도움이 될 수 있습니다.

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);
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) : 한숨을 쉬다 Nevermind, 이것은 Safari와 IE에서만 작동하며, Trunk에 존재하는지 확인하기 위해 밤에 Firefox를 다운로드하는 것을 귀찮게 할 수 없습니다 :-/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top