Как исправить ошибочно вложенные / незакрытые теги HTML? - PullRequest
16 голосов
/ 16 ноября 2008

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

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

<p>
  <ul>
    <li>Foo

становится

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

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

Ответы [ 5 ]

28 голосов
/ 16 ноября 2008

с использованием BeautifulSoup:

from BeautifulSoup import BeautifulSoup
html = "<p><ul><li>Foo"
soup = BeautifulSoup(html)
print soup.prettify()

получает вас

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

Насколько я знаю, вы не можете контролировать размещение тегов

на отдельных строках от Foo.

с использованием Tidy:

import tidy
html = "<p><ul><li>Foo"
print tidy.parseString(html, show_body_only=True)

получает вас

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

К сожалению, я не знаю, как сохранить тег

в этом примере. Tidy интерпретирует его как пустой, а не закрытый абзац, так что

print tidy.parseString(html, show_body_only=True, drop_empty_paras=False)

выходит как

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

В конечном счете, конечно, тег

в вашем примере является избыточным, так что вы можете потерять его.

Наконец, Tidy также может делать отступы:

print tidy.parseString(html, show_body_only=True, indent=True)

становится

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

Все они имеют свои взлеты и падения, но, надеюсь, один из них достаточно близко.

10 голосов
/ 16 ноября 2008

Запустите его через Tidy или одну из его портированных библиотек .

Попробуйте закодировать его вручную, и вы захотите выбить вам глаза.

4 голосов
/ 23 августа 2017

используйте html5lib, отлично работайте! как это.

soup = BeautifulSoup (data, 'html5lib')

1 голос
/ 17 сентября 2015

Только что я получил html, на котором lxml и pyquery не сработали. Поскольку 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 парсер работает намного лучше других.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 12 ноября 2018

Я пытался использовать метод ниже, но Не удалось на Python 3

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(page, 'html5lib')

Я попробовал ниже и получил Успех

soup = bs4.BeautifulSoup(html, 'html5lib')
f_html = soup.prettify()
print(f'Formatted html::: {f_html}')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...