Удаление тегов из HTML, кроме определенных (но сохранить их содержимое) - PullRequest
0 голосов
/ 06 мая 2019

Я использую этот код для удаления всех элементов тега в HTML.Мне нужно сохранить <br> и <br/>.Поэтому я использую этот код:

import re
MyString = 'aaa<p>Radio and<BR> television.<br></p><p>very<br/> popular in the world today.</p><p>Millions of people watch TV. </p><p>That’s because a radio is very small <span_style=":_black;">98.2%</span></p><p>and it‘s easy to carry. <span_style=":_black;">haha100%</span></p>bb'
MyString = re.sub('(?i)(<br\/?>)|<[^>]*>',r'\1', MyString)
print(MyString)

Вывод:

aaaRadio and<BR> television.<br>very<br/> popular in the world today.Millions of people watch TV. That’s because a radio is very small 98.2%and it‘s easy to carry. haha100%bb

Результат правильный, но теперь я хочу сохранить <p> и </p> и <br>и <br/>.

Как я могу изменить свой код?

Ответы [ 3 ]

2 голосов
/ 06 мая 2019

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

Вот рабочая реализация, которая перебирает все теги HTML, а для тех, кто не является p или br, удаляет их из тега:

from bs4 import BeautifulSoup

mystring = 'aaa<p>Radio and<BR> television.<br></p><p>very<br/> popular in the world today.</p><p>Millions of people watch TV. </p><p>That’s because a radio is very small <span_style=":_black;">98.2%</span></p><p>and it‘s easy to carry. <span_style=":_black;">haha100%</span></p>bb'

soup = BeautifulSoup(mystring,'html.parser')
for e in soup.find_all():
    if e.name not in ['p','br']:
        e.unwrap()
print(soup)

Выход:

aaa<p>Radio and<br/> television.<br/></p><p>very<br> popular in the world today.</br></p><p>Millions of people watch TV. </p><p>That’s because a radio is very small 98.2%</p><p>and it‘s easy to carry. haha100%</p>bb
0 голосов
/ 06 мая 2019

Теперь я знаю, как изменить. Но первое <p> отсутствует.

Мой код:

import re
MyString = 'aaa<p>Radio and<BR> television.<br></p><p>very<br/> popular in the world today.</p><p>Millions of people watch TV. </p><p>That’s because a radio is very small <span_style=":_black;">98.2%</span></p><p>and it‘s easy to carry. <span_style=":_black;">haha100%</span></p>bb'
# MyString = re.sub('(?i)(<br\/?>)|<[^>]*>',r'\1', MyString)
MyString = re.sub('(?i)(<br\/?>)|<[^>]*>(<\/?p>)|<[^>]*>',r'\1\2', MyString)
print(MyString)

Вывод:

aaaRadio and<BR> television.<br><p>very<br/> popular in the world today.<p>Millions of people watch TV. <p>That’s because a radio is very small 98.2%</p>and it‘s easy to carry. haha100%</p>bb
0 голосов
/ 06 мая 2019

Я не уверен, что regex является правильным решением здесь, но так как вы спросили:

import re
html = html.replace("<p>", "{p}").replace("</p>", "{/p}")
txt = re.sub("<[^>]*>", "", html)
txt = txt.replace("{p}", "<p>").replace("{/p}", "</p>")

Я существенно заменяю тег p на другой токен и заменяю обратно после удаления всех тегов.

Парсинг html с регулярным выражением, в общем, не очень хорошая идея.

...