Python 3.8 - BeautifulSoup 4 - unwrap () не удаляет все теги - PullRequest
0 голосов
/ 17 марта 2020

Я довольно долго гулял по SO, но не смог найти решение для этого. Извините, если это дубликат.

Я пытаюсь удалить все теги HTML из фрагмента, но я не хочу использовать get_text (), потому что могут быть некоторые другие теги, такие как img, что я хотел бы использовать позже. BeautifulSoup ведет себя не совсем так, как я ожидаю:

from bs4 import BeautifulSoup

html = """
<div>
<div class="somewhat">
    <div class="not quite">
    </div>
    <div class="here">
    <blockquote>
        <span>
            <a href = "sth.jpg"><br />content<br /></a>
        </span>
    </blockquote>
    </div>
    <div class="not here either">
    </div>
</div>
</div>
"""

soup = BeautifulSoup(html, 'html.parser')
la_lista = []
for x in soup.find_all('div', {"class":"somewhat"}): # in all the "somewhat" divs
    for y in x.find_all('div', {"class":"here"}):    # find all the "here" divs
        for inp in y.find_all("blockquote"):         # in a "here" div find all blockquote tags for the relevant content
            for newlines in inp('br'):
                inp.br.replace_with("\n")            # replace br tags
            for link in inp('a'):
                inp.a.unwrap()                       # unwrap all a tags
            for quote in inp('span'):
                inp.span.unwrap()                    # unwrap all span tags
            for block in inp('blockquote'):
                inp.blockquote.unwrap()              # <----- should unwrap blockquote
            la_lista.append(inp)

print(la_lista)

Результат выглядит следующим образом:

[<blockquote>


content


</blockquote>]

Есть идеи?

1 Ответ

0 голосов
/ 17 марта 2020

Тип, возвращаемый с y.find_all("blockquote") - это bs4.element.Tag, для него вы не можете назвать тег сам с помощью inp('blockquote').

Решение для вас - удалить:

            for block in inp('blockquote'):
                inp.blockquote.unwrap()   

и замените:

la_lista.append(inp)

на:

la_lista.append(inp.decode_contents())

Ответ основан на следующем ответе BeautifulSoup inner html

...