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

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

На самом деле ссылка на Dive Into Python должна быть это

Bartosz Radaczyński 02.09.2008 13:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
18
1
24 785
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

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

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

 <div>5 < 7</div>

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

 < 7</div>

как один тег и удалите его.

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

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

и код для этого будет: '' .join (BeautifulSoup (value, convertEntities = BeautifulSoup.HTML_ENTITIES) .findAll (text = Tr‌ ue))

Josh Segall 03.01.2011 23:23
Ответ принят как подходящий

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

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

И если вы просто хотите очистить HTML, посмотрите lxml.html.clean модуль

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

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

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

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

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