замена тегов html на BeautifulSoup

В настоящее время я переформатирую некоторые HTML-страницы с помощью BeautifulSoup, и у меня возникла небольшая проблема.

Моя проблема в том, что в исходном HTML есть такие вещи:

<li><p>stff</p></li>

и

<li><div><p>Stuff</p></div></li>

а также

<li><div><p><strong>stff</strong></p></div><li>

С помощью BeautifulSoup я надеюсь удалить теги div и p, если они существуют, но сохранил сильный тег.

Я просматривал документацию по красивому супу и не нашел ничего. Идеи?

Спасибо.


person Pwnna    schedule 11.10.2010    source источник


Ответы (5)


То, что вы хотите сделать, можно сделать с помощью replaceWith. Вы должны продублировать элемент, который хотите использовать в качестве замены, а затем передать его в качестве аргумента replaceWith. Документация для replaceWith довольно ясна. о том, как это сделать.

person jathanism    schedule 11.10.2010
comment
FWIW, crummy.com/software/BeautifulSoup/bs4/doc/# replace-with - это документация по BS4 - person Amanda; 27.10.2012

Этот вопрос, вероятно, относился к более старой версии BeautifulSoup, потому что с bs4 вы можете просто использовать развернуть функцию:

s = BeautifulSoup('<li><div><p><strong>stff</strong></p></div><li>')
s.div.unwrap()
>> <div></div>
s.p.unwrap()
>> <p></p>
s
>> <html><body><li><strong>stff</strong></li><li></li></body></html>
person Suzana    schedule 09.12.2013

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

soup = BeautifulSoup(htmlData, "html.parser")

h2_headers = soup.find_all("h2")

for header in h2_headers:
    header.name = "h1" # replaces h2 tag with h1 

Все теги h2 конвертированы в h1. Вы можете преобразовать любой тег, просто изменив имя.

person user14402164    schedule 06.10.2020

Вы можете написать свою собственную функцию для удаления тегов:

import re

def strip_tags(string):
    return re.sub(r'<.*?>', '', string)

strip_tags("<li><div><p><strong>stff</strong></p></div><li>")
'stff'
person suzanshakya    schedule 11.10.2010
comment
да, но я действительно хочу ‹strong› там. Также, просмотрев пару случайных страниц, можно беспокоиться только о div и p. - person Pwnna; 11.10.2010

Простое решение: получить весь узел означает div:

  1. Преобразовать в строку
  2. Замените <tag> на требуемый тег / строку.
  3. Замените соответствующий тег пустой строкой.
  4. Преобразуйте преобразованную строку в синтаксическую строку, перейдя в beautifulsoup

    Что я сделал для mint

    Пример:

    <div class="col-md-12 option" itemprop="text">
    <span class="label label-info">A</span>
    
    **-2<sup>31</sup> to 2<sup>31</sup>-1**
    

    sup = opt.sup 
        if sup: //opt has sup tag then
    
             //opts converted to string. 
             opt = str(opts).replace("<sup>","^").replace("</sup>","") //replacing
    
             //again converted from string to beautiful string.
             s = BeautifulSoup(opt, 'lxml')
    
             //resign to required variable after manipulation
             opts = s.find("div", class_="col-md-12 option")
    

    Output:

    -2^31 to 2^31-1
    without manipulation it will like this (-231 to 231-1)
    
person Ishaq    schedule 08.12.2018