Python中的正则表达式,用于删除XML注释和HTML元素

时间:2011-10-12 11:42:50

标签: python regex string

我正在使用Universal feed Parser解析RSS内容。在描述标签中有时候 我正在寻找类似下面的线索:

<!--This is the XML comment -->
<p>This is a Test Paragraph</p></br>
<b>Sample Bold</b>
<m:Table>Sampe Text</m:Table>

为了删除HTML元素/标签,我使用以下正则表达式。

pattern = re.compile(u'<\/?\w+\s*[^>]*?\/?>', re.DOTALL | re.MULTILINE | re.IGNORECASE | re.UNICODE)
desc = pattern.sub(u" ", desc)

这有助于删除HTML标记,但不删除xml注释。如何删除elemnts和XML coments?

4 个答案:

答案 0 :(得分:5)

使用lxml

import lxml.html as LH

content='''
<!--This is the XML comment -->
<p>This is a Test Paragraph</p></br>
<b>Sample Bold</b>
<Table>Sampe Text</Table>
'''

doc=LH.fromstring(content)
print(doc.text_content())

产量

This is a Test Paragraph
Sample Bold
Sampe Text

答案 1 :(得分:4)

使用正则表达式这是一个坏主意。

在使用真正的解析器后我会导航DOM树并删除我想要的方式。

答案 2 :(得分:1)

使用纯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 - 如果您对该课程感兴趣(关于使用python进行智能调试),我会给你一个链接:http://www.udacity.com/overview/Course/cs259/CourseRev/1。免费!

欢迎你!

答案 3 :(得分:0)

为什么这么复杂? re.sub('<!\[CDATA\[(.*?)\]\]>|<.*?>', lambda m: m.group(1) or '', desc, flags=re.DOTALL)

如果您希望XML标记保持不变,您应该在http://www.whatwg.org/specs/web-apps/current-work/multipage/查看HTML标记列表并使用'(<!\[CDATA\[.*?\]\]>)|<!--.*?-->|</?(?:tag names separated by pipes)(?:\s.*?)?>'正则表达式。