from mechanize import Browser
br = Browser()
br.open('http://somewebpage')
html = br.response().readlines()
for line in html:
print line
При печати строки в файле HTML я пытаюсь найти способ показать только содержимое каждого элемента HTML, а не само форматирование. Если он найдет '<a href="whatever.com">some text</a>'
, он напечатает только «некоторый текст», '<b>hello</b>'
напечатает «привет» и т. Д. Как можно поступить так?
&
). Вы можете либо 1) удалить их вместе с тегами (часто нежелательно и ненужно, поскольку они эквивалентны простому тексту), 2) оставить их без изменений (подходящее решение, если выделенный текст возвращается обратно в контекст HTML), или 3 ) расшифруйте их в виде обычного текста (если выделенный текст попадает в базу данных или в какой-либо другой контекст, отличный от HTML, или если ваша веб-платформа автоматически выполняет HTML-экранирование текста для вас).Ответы:
Я всегда использовал эту функцию для удаления тегов HTML, так как для этого требуется только stthon-библиотека Python:
Для Python 3:
Для Python 2:
источник
&
), а также теги.__init__
функцию родительского класса . Смотрите здесь: stackoverflow.com/questions/11061058/… .parser = HTMLParser()
иhtml = parser.unescape(html)
в начало функции strip_tags.Я не особо задумывался о случаях, которые он пропустит, но вы можете сделать простое регулярное выражение:
Для тех, кто не понимает регулярное выражение, он ищет строку
<...>
, где внутреннее содержимое состоит из одного или нескольких (+
) символов, которые не являются<
. В?
означает , что он будет соответствовать наименьшую строку , она может найти. Например, учитывая<p>Hello</p>
, он будет соответствовать<'p>
и</p>
отдельно с?
. Без этого он будет соответствовать всей строке<..Hello..>
.Если
<
в html появляется не тег (например2 < 3
), он должен быть записан как escape-последовательность,&...
так что это^<
может быть ненужным.источник
&
) неизменными в выводе.cgi.escape(s, True)
, даже если вы «знаете», что она не содержит HTML (например, потому что вы удалили содержимое HTML) , Однако это не то, о чем спрашивал ОП.Вы можете использовать
get_text()
функцию BeautifulSoup .Желательно явно указать синтаксический анализатор , например as
BeautifulSoup(html_str, features="html.parser")
, чтобы вывод был воспроизводимым.источник
Укороченная версия!
Источник регулярных выражений: MarkupSafe . Их версия также обрабатывает сущности HTML, а эта быстрая - нет.
Почему я не могу просто удалить метки и оставить это?
Одно дело удерживать людей от
<i>italicizing</i>
вещей, не оставляяi
парящих вокруг. Но это другой способ принять произвольный вклад и сделать его совершенно безвредным. Большинство методов на этой странице оставят такие вещи, как незакрытые комментарии (<!--
) и угловые скобки, которые не являются частью тегов (blah <<<><blah
нетронутыми ). Версия HTMLParser может даже оставлять полные теги, если они находятся внутри закрытого комментария.Что делать, если ваш шаблон
{{ firstname }} {{ lastname }}
?firstname = '<a'
иlastname = 'href="http://evil.com/">'
будет пропущен всеми стриптизерами тегов на этой странице (кроме @Medeiros!), потому что они сами по себе не являются полными тегами. Удалять обычные HTML-теги недостаточно.Django
strip_tags
, улучшенная (см. Следующий заголовок) версия главного ответа на этот вопрос, выдает следующее предупреждение:Следуй их советам!
Чтобы удалить теги с HTMLParser, вы должны запустить его несколько раз.
Легко обойти главный ответ на этот вопрос.
Посмотрите на эту строку ( источник и обсуждение ):
Когда HTMLParser видит его впервые, он не может сказать, что
<img...>
это тег. Он выглядит разбитым, поэтому HTMLParser не избавится от него. Это только вынимает<!-- comments -->
, оставляя вас сЭта проблема была раскрыта проекту Django в марте 2014 года. Их старый
strip_tags
был по сути тем же, что и главный ответ на этот вопрос. Их новая версия в основном запускает его в цикле, пока повторный запуск не изменит строку:Конечно, ничто из этого не является проблемой, если вы всегда избегаете результата
strip_tags()
.Обновление 19 марта 2015 : в версиях Django до 1.4.20, 1.6.11, 1.7.7 и 1.8c1 произошла ошибка. Эти версии могут ввести бесконечный цикл в функцию strip_tags (). Фиксированная версия воспроизводится выше. Подробнее здесь .
Хорошие вещи, чтобы скопировать или использовать
Мой пример кода не обрабатывает сущности HTML, как это делают упакованные версии Django и MarkupSafe.
Мой пример кода взят из превосходной библиотеки MarkupSafe для предотвращения межсайтовых скриптов. Это удобно и быстро (с ускорением C до его родной версии Python). Он включен в Google App Engine и используется Jinja2 (2.7 и выше) , Mako, Pylons и другими. Он легко работает с шаблонами Django из Django 1.7.
Django strip_tags и другие html-утилиты из последней версии хороши, но я считаю их менее удобными, чем MarkupSafe. Они довольно автономны, вы можете скопировать то, что вам нужно из этого файла .
Если вам нужно удалить практически все теги, библиотека Bleach подойдет. Вы можете заставить его применять такие правила, как «мои пользователи могут выделять курсивом, но не могут создавать фреймы».
Поймите свойства вашего стриптизерши! Запустите пушистые тесты! Вот код, который я использовал для исследования этого ответа.
зову примечание - сам вопрос касается печати на консоль, но это лучший результат Google для "python strip html from string", поэтому этот ответ на 99% относится к сети.
источник
Мне нужен был способ вырезать теги и декодировать HTML-объекты в обычный текст. Следующее решение основано на ответе Элоффа (который я не смог использовать, потому что он удаляет сущности).
Быстрый тест:
Результат:
Обработка ошибок:
&#apos;
, допустимые в XML и XHTML, но не в обычном HTML) вызовутValueError
исключение.ValueError
исключение.Примечание по безопасности: Не путайте разметку HTML (преобразование HTML в простой текст) с очисткой HTML (преобразование обычного текста в HTML). Этот ответ удалит HTML и расшифрует сущности в простой текст, что не делает результат безопасным для использования в контексте HTML.
Пример:
<script>alert("Hello");</script>
будет преобразован в<script>alert("Hello");</script>
, что является 100% правильным поведением, но явно недостаточно, если полученный простой текст вставляется как есть на HTML-страницу.Правило несложное: каждый раз, когда вы вставляете текстовую строку в вывод HTML, вы всегда должны избегать его (используя
cgi.escape(s, True)
, даже если вы «знаете», что она не содержит HTML (например, потому что вы удалили содержимое HTML) ,(Однако OP спросил о выводе результата на консоль, и в этом случае экранирование HTML не требуется.)
Версия Python 3.4+: (с doctest!)
Обратите внимание, что HTMLParser улучшился в Python 3 (что означает меньше кода и лучшую обработку ошибок).
источник
Есть простой способ сделать это:
Идея объясняется здесь: http://youtu.be/2tu9LTDujbw
Вы можете увидеть это работает здесь: http://youtu.be/HPkNPcYed9M?t=35s
PS - Если вы заинтересованы в классе (об умной отладке с python), я дам вам ссылку: http://www.udacity.com/overview/Course/cs259/CourseRev/1 . Это бесплатно!
Пожалуйста! :)
источник
<b class="o'>x</b>
качестве входных данных функции выходаx
. Но на самом деле этот ввод недействителен. Я думаю, именно поэтому люди предпочитают библиотек.Если вам нужно сохранить сущности HTML (то есть
&
), я добавил метод «handle_entityref» к ответу Eloff .источник
Если вы хотите удалить все теги HTML, я нашел самый простой способ - использовать BeautifulSoup:
Я попробовал код принятого ответа, но получал «RuntimeError: превышена максимальная глубина рекурсии», чего не произошло с вышеуказанным блоком кода.
источник
''.join(BeautifulSoup('<em>he</em>llo<br>world').find_all(text=True))
. Здесь вывод "helloworld", в то время как вы, вероятно, хотите, чтобы это был "hello world".' '.join(BeautifulSoup('<em>he</em>llo<br>world').find_all(text=True))
не помогает, поскольку это становится "он мир llo".Вот простое решение, которое удаляет HTML-теги и декодирует HTML-объекты на основе удивительно быстрой
lxml
библиотеки:источник
text_content()
возвращается,lxml.etree._ElementUnicodeResult
так что вам, возможно, придется сначала привести его к последовательностиstr
строковым операциям, таким как+
и индексация[]
. В любом случае добавлен актерский акт для хорошей меры.Lxml.html основанное решение (LXML является родной библиотеки и , следовательно , гораздо быстрее , чем любой чистый раствор питона).
Если вам требуется больше контроля над тем, что именно очищается перед преобразованием в текст, тогда вы можете явно использовать lxml Cleaner , передавая нужные параметры в конструкторе, например:
источник
Пакет Beautiful Soup сделает это немедленно для вас.
источник
Вот мое решение для Python 3.
Не уверен, что это идеально, но решил мой вариант использования и кажется простым.
источник
Вы можете использовать другой HTML-парсер ( например, lxml или Beautiful Soup ) - тот, который предлагает функции для извлечения только текста. Или, вы можете запустить регулярное выражение в строке строки, которая удаляет теги. Смотрите Python документы для получения дополнительной информации.
источник
lxml.html.fromstring(s).text_content()
&
) в текст.Я успешно использовал ответ Элоффа для Python 3.1 [большое спасибо!].
Я обновился до Python 3.2.3 и столкнулся с ошибками.
Решение, предоставленное здесь благодаря респонденту Томасу К, заключается в том, чтобы вставить
super().__init__()
следующий код:... чтобы это выглядело так:
... и это будет работать для Python 3.2.3.
Еще раз спасибо Thomas K за исправление и за оригинальный код Eloff, представленный выше!
источник
Вы можете написать свою собственную функцию:
источник
Все решения с HTML-парсером можно взломать, если они запускаются только один раз:
результаты в:
что вы намереваетесь предотвратить. если вы используете HTML-парсер, считайте теги до замены нуля:
источник
html_to_text
и встраиваете выводимый из этой функции текст в html без экранирования этого текста, то это отсутствие экранирования, которое является уязвимостью безопасности, а неhtml_to_text
функцией.html_to_text
Функция никогда не обещал вам выход будет текст. А вставка текста в html без экранирования является потенциальной уязвимостью безопасности, независимо от того, получили ли вы текст изhtml_to_text
какого-либо другого источника.Это быстрое решение, которое может быть еще более оптимизировано, но оно будет работать нормально. Этот код заменит все непустые теги на «» и удалит все HTML-теги из заданного входного текста. Вы можете запустить его, используя ./file.py входной вывод
источник
Адаптация ответа Сёрена-Левборга на Python 3
источник
Для одного проекта мне нужно было раздеть HTML, а также CSS и JS Таким образом, я сделал вариант ответа Eloffs:
источник
Вот решение, аналогичное принятому в настоящее время ответу ( https://stackoverflow.com/a/925630/95989 ), за исключением того, что оно использует внутренний
HTMLParser
класс напрямую (т.е. не имеет подклассов), тем самым делая его значительно более кратким:источник
Я разбираю Github readmes и обнаружил, что следующее действительно хорошо работает:
А потом
Удаляет все уценки и HTML правильно.
источник
Используя BeautifulSoup, html2text или код из @Eloff, в большинстве случаев остаются некоторые элементы html, код javascript ...
Таким образом, вы можете использовать комбинацию этих библиотек и удалить форматирование уценки (Python 3):
Это хорошо работает для меня, но может быть улучшено, конечно ...
источник
Простой код! Это удалит все виды тегов и содержимого внутри него.
Но он не даст полного результата, если текст содержит символы <> .
источник
источник
Этот метод работает для меня безупречно и не требует дополнительных установок:
источник