Как исправить неправильно вложенные/закрытые теги HTML?
Мне нужно дезинформировать HTML, отправленный пользователем, закрыв любые открытые теги с правильным порядком вложенности. Я искал алгоритм или код Python для этого, но ничего не нашел, кроме некоторых полузасужденных реализаций в PHP и т.д.
Например, что-то вроде
<p>
<ul>
<li>Foo
становится
<p>
<ul>
<li>Foo</li>
</ul>
</p>
Любая помощь будет оценена:)
Ответы
Ответ 1
используя BeautifulSoup:
from BeautifulSoup import BeautifulSoup
html = "<p><ul><li>Foo"
soup = BeautifulSoup(html)
print soup.prettify()
получает вас
<p>
<ul>
<li>
Foo
</li>
</ul>
</p>
Насколько я знаю, вы не можете управлять помещением <li> </li> теги на отдельных строках от Foo.
с помощью Tidy:
import tidy
html = "<p><ul><li>Foo"
print tidy.parseString(html, show_body_only=True)
получает вас
<ul>
<li>Foo</li>
</ul>
К сожалению, я не знаю, как сохранить <p> в примере. Тиди интерпретирует его как пустой абзац, а не незакрытый, поэтому
print tidy.parseString(html, show_body_only=True, drop_empty_paras=False)
появляется как
<p></p>
<ul>
<li>Foo</li>
</ul>
В конечном счете, конечно, <p> тег в вашем примере является избыточным, поэтому вы можете быть в порядке с его потерей.
Наконец, Tidy также может делать отступы:
print tidy.parseString(html, show_body_only=True, indent=True)
становится
<ul>
<li>Foo
</li>
</ul>
Все они имеют свои взлеты и падения, но, надеюсь, один из них достаточно близко.
Ответ 2
Запустите его через Tidy или один из его портированных библиотеки.
Попробуйте ввести его вручную, и вам захочется вырвать глаза.
Ответ 3
Как раз сейчас, я получил html, в котором lxml и pyquery не работали хорошо, кажется, что в html есть некоторые ошибки.
Поскольку Tidy не просто установить в windows, я выбираю BeautifulSoup
.
Но я обнаружил, что:
from BeautifulSoup import BeautifulSoup
import lxml.html
soup = BeautifulSoup(page)
h = lxml.html(soup.prettify())
действуют так же, как h = lxml.html(page)
Какая реальная проблема решена? soup = BeautifulSoup(page, 'html5lib')
.
Сначала вы должны установить html5lib
, а затем использовать его как парсер в BeautifulSoup
.
Парсер html5lib
кажется намного лучше, чем другие.
Надеюсь, это поможет кому-то.
Ответ 4
используйте html5lib, отлично работайте!
как это.
soup = BeautifulSoup (данные, 'html5lib')