python удалить текст внутри <p> - PullRequest
0 голосов
/ 13 апреля 2011

Я хочу удалить текст внутри <p> тегов для блока HTML-текста. Я пытаюсь стандартизировать некоторый текст и удалить всю информацию о классе, выравнивании и другую. Кажется, что каждый пример, который я могу найти, касается удаления HTML, и я не хочу лишать теги. Я просто хочу сделать их понятными.

Так что, если у меня есть что-то вроде этого:

<p class='MsoBodyText' align='left'>
some paragraph blah blah blah
</p>

<p class='SomeClassIDontWant' align='right'>
some other paragraph blah blah blah
</p>

Я хочу вернуть:

<p>
some paragraph blah blah blah
</p>

<p>
some other paragraph blah blah blah
</p>

Ответы [ 4 ]

6 голосов
/ 13 апреля 2011

Используйте библиотеку для разбора HTML, например Beautiful Soup или аналогичную альтернативу. Regex недостаточно мощен, чтобы правильно анализировать HTML .

@ Марк отметил, что в данном конкретном случае простое регулярное выражение должно работать, потому что вы не выполняете полный анализ с тегомсопоставление и т. д. Я все еще думаю, что это хорошая практика - знакомиться с этими библиотеками синтаксического анализа, когда вам нужны более сложные операции.

<p title="1 > 0">Test</p>

Я считаю верным html.По крайней мере, Chrome принимает это, и я уверен, что другие браузеры также.

3 голосов
/ 13 апреля 2011

Использовать BeautifulSoup довольно просто, вы создаете элемент BeautifulSoup из строки, а затем для каждого элемента в этом объекте вы устанавливаете список атрибутов в пустой список, например:

from BeautifulSoup import *
parsed_html = BeautifulSoup(your_html)
for elem in parsed_html:
   if not isinstance(elem, NavigableString): #You need to know that it is a node and not text
       elem.attrs = []
print parsed_html # It is clean now

ДляБолее подробную информацию о BeautifulSoup вы можете найти в документации BeautifulSoup

1 голос
/ 13 апреля 2011

Regex будет отсутствовать в случае разделителей и т. Д. Вы должны использовать анализатор HTML, наиболее распространенным из которых является красивый суп.

Также обратите внимание, что вам нужно работать с Unicode, а также с простой строкой.

Вот решение от меня:

from BeautifulSoup import BeautifulSoup, Tag

def clear_p_tags(html_str):
    """ Works well both for unicode as well as str """
    html = BeautifulSoup(html_str)

    for elem in parsed_html:
        if type(elem) is Tag: elem.attrs = []
    return type(html_str)(html)


def test_p_clear(str_data):

    html_str = data
    html_unicode = unicode(data)

    clear_p_html_str = clear_p_tags(html_str)
    clear_p_html_unicode = clear_p_tags(html_unicode)

    print type(clear_p_html_str)
    print clear_p_html_str

    print type(clear_p_html_unicode)
    print clear_p_html_unicode

data = """
<a href="hello.txt"> hello </a>
<p class='MsoBodyText' align='left'>
some paragraph blah blah blah
</p>

<p class='SomeClassIDontWant' align='right'>
some other paragraph blah blah blah
</p>
"""

test_p_clear(data)
0 голосов
/ 13 апреля 2011

Я за ответ Davy8. Вы также можете заглянуть в lxml.html .

Если вы все еще хотите использовать регулярные выражения ... вы должны использовать что-то вроде:

re.sub(r'<p [^>]*?>', r'<p>', foo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...