codememo

문자열에서 HTML 태그를 제거하는 Python 코드

tipmemo 2023. 6. 12. 21:31
반응형

문자열에서 HTML 태그를 제거하는 Python 코드

다음과 같은 텍스트가 있습니다.

text = """<div>
<h1>Title</h1>
<p>A long text........ </p>
<a href=""> a link </a>
</div>"""

외부 모듈 없이 순수 Python을 사용하면 다음과 같습니다.

>>> print remove_tags(text)
Title A long text..... a link

lxml.html.fromstring(텍스트) 사용하여 수행할 수 있습니다.text_content() 하지만 2.6+용 내장 또는 표준 라이브러리를 사용하는 순수 파이썬에서 동일한 것을 달성해야 합니다.

내가 어떻게 그럴 수 있을까?

정규식 사용

정규식을 사용하여 내부의 모든 것을 청소할 수 있습니다.<>:

import re
# as per recommendation from @freylis, compile once only
CLEANR = re.compile('<.*?>') 

def cleanhtml(raw_html):
  cleantext = re.sub(CLEANR, '', raw_html)
  return cleantext

일부 HTML 텍스트에는 '와 같이 괄호로 묶지 않은 엔티티도 포함될 수 있습니다.&nsbm그렇다면 정규식을 다음과 같이 쓰는 것이 좋습니다.

CLEANR = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});')

링크에는 이에 대한 자세한 내용이 포함되어 있습니다.

아름다운 수프 사용하기

사용할 수도 있습니다.BeautifulSoup모든 원시 텍스트를 찾기 위한 추가 패키지.

BeautifulSoup을 호출할 때 파서를 명시적으로 설정해야 합니다."lxml"대안적인 답변에서 언급된 바와 같이 (기본 답변보다 더 강력한 답변이 될 수 있습니다.html.parser)(즉, 추가 설치 없이 사용 가능).

from bs4 import BeautifulSoup
cleantext = BeautifulSoup(raw_html, "lxml").text

하지만 외부 라이브러리를 사용하는 것을 방해하지는 않으므로 첫 번째 솔루션을 추천합니다.

편집: 사용하기lxml할 필요가 있습니다.pip install lxml.

Python에는 여러 개의 XML 모듈이 내장되어 있습니다.완전한 HTML을 가진 문자열이 이미 있는 경우에 가장 간단한 것은 당신이 언급한 lxml 예제와 유사하게 (어느 정도) 작동하는 것입니다.

def remove_tags(text):
    return ''.join(xml.etree.ElementTree.fromstring(text).itertext())

이건 완벽하지 않다는 걸 알아둬요, 왜냐하면 만약 당신이 이런 것을 가지고 있다면,<a title=">">깨질 거예요하지만, 이것은 정말 복잡한 기능 없이 비도서관 파이썬에서 가장 가까운 것입니다.

import re

TAG_RE = re.compile(r'<[^>]+>')

def remove_tags(text):
    return TAG_RE.sub('', text)

그러나 lvc 언급은 Python Standard Library에서 사용할 수 있으므로 기존과 같이 사용할 수 있도록 조정할 수 있습니다.lxml버전:

def remove_tags(text):
    return ''.join(xml.etree.ElementTree.fromstring(text).itertext())

C와 같은 언어를 사용하는 간단한 방법이 있습니다.이 스타일은 Pythonic이 아니지만 순수 Python과 함께 작동합니다.

def remove_html_markup(s):
    tag = False
    quote = False
    out = ""

    for c in s:
            if c == '<' and not quote:
                tag = True
            elif c == '>' and not quote:
                tag = False
            elif (c == '"' or c == "'") and tag:
                quote = not quote
            elif not tag:
                out = out + c

    return out

이 아이디어는 단순한 유한 상태 기계를 기반으로 하며 여기에 자세히 설명되어 있습니다. http://youtu.be/2tu9LTDujbw

http://youtu.be/HPkNPcYed9M?t=35s 에서 작동하는 것을 확인할 수 있습니다.

PS - 만약 당신이 (파이썬으로 스마트 디버깅하는 것에 대해) 수업에 관심이 있다면, 나는 당신에게 링크를 제공합니다: https://www.udacity.com/course/software-debugging--cs259 .무료입니다!

global temp

temp =''

s = ' '

def remove_strings(text):

    global temp 

    if text == '':

        return temp

    start = text.find('<')

    end = text.find('>')

    if start == -1 and end == -1 :

        temp = temp + text

    return temp

newstring = text[end+1:]

fresh_start = newstring.find('<')

if newstring[:fresh_start] != '':

    temp += s+newstring[:fresh_start]

remove_strings(newstring[fresh_start:])

return temp

언급URL : https://stackoverflow.com/questions/9662346/python-code-to-remove-html-tags-from-a-string

반응형