Отфильтруйте теги HTML и разрешите сущности в Python

Поскольку регулярные выражения меня пугают, я пытаюсь найти способ удалить все теги HTML и разрешить объекты HTML из строки в Python.

8 ответов

Решение

Используйте lxml, которая является лучшей библиотекой xml/html для python.

import lxml.html
t = lxml.html.fromstring("...")
t.text_content()

И если вы просто хотите продезинфицировать HTML, посмотрите на модуль lxml.html.clean.

Используйте BeautifulSoup! Это идеально подходит для этого, когда у вас есть входящая разметка сомнительной добродетели и вам нужно извлечь из этого что-то разумное. Просто передайте исходный текст, извлеките все строковые теги и присоединитесь к ним.

Хотя я согласен с Лукасом в том, что регулярные выражения не так уж страшны, я все же думаю, что вам следует использовать специализированный HTML-парсер. Это связано с тем, что стандарт HTML достаточно сложен (особенно если вы хотите произвольно анализировать "HTML" страницы, извлеченные из Интернета), что вам потребуется написать много кода для обработки угловых случаев. Кажется, что Python включает в себя один из коробки.

Вам также следует проверить привязки Python для TidyLib, которые могут очистить поврежденный HTML, что значительно увеличивает вероятность успеха любого HTML-анализа.

Как насчет анализа данных HTML и извлечения данных с помощью парсера?

Я бы попробовал что-то наподобие автора, описанного в главе 8.3 книги Dive Into Python.

Если вы используете django, вы также можете использовать http://docs.djangoproject.com/en/dev/ref/templates/builtins/;)

Вам может понадобиться что-то более сложное, чем регулярное выражение. Веб-страницы часто имеют угловые скобки, которые не являются частью тега, например:

 <div>5 < 7</div>

Удаление тегов с помощью регулярного выражения вернет строку "5 " и обработает

 < 7</div>

как один тег и раздеть его.

Я предлагаю поискать уже написанный код, который сделает это за вас. Я сделал поиск и нашел это: http://zesty.ca/python/scrape.html Он также может разрешать HTML-сущности.

Глядя на количество смысла, которое люди демонстрируют в других ответах, я бы сказал, что использование регулярных выражений, вероятно, не лучшая идея для вашей ситуации. Пойдите для чего-то проверенного и испытанного, и рассматривайте мой предыдущий ответ как демонстрацию того, что регулярные выражения не должны быть такими страшными.

Регулярные выражения не страшны, но написание собственных регулярных выражений для удаления HTML- верный путь к безумию (и это тоже не сработает). Следуйте по пути мудрости и используйте одну из многих хороших библиотек HTML-парсинга.

Пример Лукаса также не работает, потому что "sub" не является методом строки Python. Вам нужно будет "импортировать re", а затем вызвать re.sub (pattern, repl, string). Но это ни здесь, ни там, поскольку правильный ответ на ваш вопрос не предполагает написания каких-либо регулярных выражений.

Другие вопросы по тегам