Регулярное выражение в Python для удаления комментариев XML и элементов HTML - PullRequest
1 голос
/ 12 октября 2011

Я анализирую RSS-контент, используя универсальный анализатор каналов. В описании тега несколько раз Я получаю Velues, как показано ниже:

<!--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-комментарии?

Ответы [ 4 ]

5 голосов
/ 12 октября 2011

Использование 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
4 голосов
/ 12 октября 2011

Использование регулярных выражений таким способом - плохая идея.

Я бы перемещался по дереву DOM после использования реального парсера и удалял то, что хотел таким образом.

1 голос
/ 22 января 2013

Есть простой способ сделать это с чистым 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. Это бесплатно!

Не за что!

0 голосов
/ 12 октября 2011

Почему так сложно? re.sub('<!\[CDATA\[(.*?)\]\]>|<.*?>', lambda m: m.group(1) or '', desc, flags=re.DOTALL)

Если вы хотите, чтобы теги XML не были повреждены, вам, вероятно, следует проверить список тегов HTML на http://www.whatwg.org/specs/web-apps/current-work/multipage/ и использовать регулярное выражение '(<!\[CDATA\[.*?\]\]>)|<!--.*?-->|</?(?:tag names separated by pipes)(?:\s.*?)?>'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...