Удалите использование тега BeautifulSoup, но сохраните его содержание

Решение для Java:

public class QuickTest {

public static void main(String[] args) {
    check("AmanaplanacanalPanama".toLowerCase());
    check("Hello World".toLowerCase());
}

public static void check(String aString) {
    System.out.print(aString + ": ");
    char[] chars = aString.toCharArray();
    for (int i = 0, j = (chars.length - 1); i < (chars.length / 2); i++, j--) {
        if (chars[i] != chars[j]) {
            System.out.println("Not a palindrome!");
            return;
        }
    }
    System.out.println("Found a palindrome!");
}

}

48
задан Lev Levitsky 8 June 2014 в 09:55
поделиться

3 ответа

Стратегия, которую я использовал, заключается в замене тега его содержимым, если они имеют тип NavigableString , а если нет, то рекурсивно просматривайте их и заменяйте их содержимое на NavigableString и т. Д. Попробуйте следующее:

from BeautifulSoup import BeautifulSoup, NavigableString

def strip_tags(html, invalid_tags):
    soup = BeautifulSoup(html)

    for tag in soup.findAll(True):
        if tag.name in invalid_tags:
            s = ""

            for c in tag.contents:
                if not isinstance(c, NavigableString):
                    c = strip_tags(unicode(c), invalid_tags)
                s += unicode(c)

            tag.replaceWith(s)

    return soup

html = "<p>Good, <b>bad</b>, and <i>ug<b>l</b><u>y</u></i></p>"
invalid_tags = ['b', 'i', 'u']
print strip_tags(html, invalid_tags)

Результат:

<p>Good, bad, and ugly</p>

Я дал тот же ответ на другой вопрос. Вроде много придумали.

56
ответ дан 7 November 2019 в 12:03
поделиться

У меня есть более простое решение, но я не знаю, есть ли у него недостаток.

ОБНОВЛЕНИЕ: есть недостаток, см. Комментарий Джесси Диллона. Кроме того, другим решением будет использование Mozilla Bleach вместо BeautifulSoup.

from BeautifulSoup import BeautifulSoup

VALID_TAGS = ['div', 'p']

value = '<div><p>Hello <b>there</b> my friend!</p></div>'

soup = BeautifulSoup(value)

for tag in soup.findAll(True):
    if tag.name not in VALID_TAGS:
        tag.replaceWith(tag.renderContents())

print soup.renderContents()

Это также напечатает

Привет, мой друг!

по желанию.

10
ответ дан 7 November 2019 в 12:03
поделиться

Предположительно, вам придется переместить дочерние элементы тега в дочерние элементы родительского тега, прежде чем удалять тег - вы это имеете в виду?

Если да, то при вставке содержимого в нужном месте сложно, должно сработать что-то вроде этого:

from BeautifulSoup import BeautifulSoup

VALID_TAGS = 'div', 'p'

value = '<div><p>Hello <b>there</b> my friend!</p></div>'

soup = BeautifulSoup(value)

for tag in soup.findAll(True):
    if tag.name not in VALID_TAGS:
        for i, x in enumerate(tag.parent.contents):
          if x == tag: break
        else:
          print "Can't find", tag, "in", tag.parent
          continue
        for r in reversed(tag.contents):
          tag.parent.insert(i, r)
        tag.extract()
print soup.renderContents()

с примером значения, это печатает

Привет, мой друг!

по желанию .

6
ответ дан 7 November 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: