Подтвердить что ты не робот

Как исправить неправильно вложенные/закрытые теги HTML?

Мне нужно дезинформировать HTML, отправленный пользователем, закрыв любые открытые теги с правильным порядком вложенности. Я искал алгоритм или код Python для этого, но ничего не нашел, кроме некоторых полузасужденных реализаций в PHP и т.д.

Например, что-то вроде

<p>
  <ul>
    <li>Foo

становится

<p>
  <ul>
    <li>Foo</li>
  </ul>
</p>

Любая помощь будет оценена:)

4b9b3361

Ответ 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')