Решение для 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!");
}
}
Стратегия, которую я использовал, заключается в замене тега его содержимым, если они имеют тип 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>
Я дал тот же ответ на другой вопрос. Вроде много придумали.
У меня есть более простое решение, но я не знаю, есть ли у него недостаток.
ОБНОВЛЕНИЕ: есть недостаток, см. Комментарий Джесси Диллона. Кроме того, другим решением будет использование 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()
Это также напечатает Привет, мой друг!
по желанию.
Предположительно, вам придется переместить дочерние элементы тега в дочерние элементы родительского тега, прежде чем удалять тег - вы это имеете в виду?
Если да, то при вставке содержимого в нужном месте сложно, должно сработать что-то вроде этого:
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()
с примером значения, это печатает Привет, мой друг!
по желанию .