Python: удаление всех div без класса - PullRequest
0 голосов
/ 01 марта 2020

Я хочу удалить все div без классов (кроме содержимого, которое есть в div).

Мой ввод

<h1>Test</h1>
<div>
    <div>
        <div class="test">
            <p>abc</p>
        </div>
    </div>
</div>

вывод я хочу

<h1>Test</h1>
<div class="test">    
    <p>abc</p>
</div>

Моя попытка 1

На основе " Удаление div с определенным классом ":

from bs4 import BeautifulSoup
soup = BeautifulSoup('<h1>Test</h1><div><div><div class="test"><p>abc</p></div></div></div>', 'html.parser')   
for div in soup.find_all("div", {'class':''}): 
    div.decompose()
print(soup)
# <h1>Test</h1>

Моя попытка 2

from htmllaundry import sanitize
myinput = '<h1>Test</h1><div><div><div class="test"><p>abc</p></div></div></div>'
myoutput = sanitize(myinput)
print myoutput
# <p>Test</p><p>abc</p> instead of <h1>Test</h1><div class="test"><p>abc</p></div>

Моя попытка 3

На основе " Очистить HTML in python "

from lxml.html.clean import Cleaner

def sanitize(dirty_html):
    cleaner = Cleaner(remove_tags=('font', 'div'))

    return cleaner.clean_html(dirty_html)


myhtml = '<h1>Test</h1><div><div><div class="test"><p>abc</p></div></div></div>'

print(sanitize(myhtml))
# <div><h1>Test</h1><p>abc</p></div>

Моя попытка 4

from html_sanitizer import Sanitizer
sanitizer = Sanitizer()  # default configuration
output = sanitizer.sanitize('<h1>Test</h1><div><div><div class="test"><p>abc</p></div></div></div>')
print(output)
# <h1>Test</h1><p>abc</p>

Проблема: элемент div используется для упаковки HTML фрагмент для синтаксического анализатора, поэтому div теги не допускаются. (Источник: Руководство )

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Если вы хотите исключить div без класса, сохраняя его содержимое:

from bs4 import BeautifulSoup
markup = '<h1>Test</h1><div><div><div class="test"><p>abc</p></div></div></div>'
soup = BeautifulSoup(markup,"html.parser")
for tag in soup.find_all():
    empty = tag.name == 'div' and not(tag.has_attr('class'))
    if not(empty):
        print(tag)

Вывод:

<h1>Test</h1>
<div class="test"><p>abc</p></div>
<p>abc</p>
0 голосов
/ 01 марта 2020

Пожалуйста, проверьте это.

from bs4 import BeautifulSoup

data="""
<div>
    <div>
        <div class="test">
            <p>abc</p>
        </div>
    </div>
</div>
"""
soup = BeautifulSoup(data, features="html5lib")

for div in soup.find_all("div", class_=True):
    print(div)

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