Используйте html5lib для преобразования фрагмента HTML в простой текст - PullRequest
6 голосов
/ 31 декабря 2011

Есть ли простой способ использовать библиотеку Python html5lib для преобразования чего-то подобного:

<p>Hello World. Greetings from <strong>Mars.</strong></p>

в

Hello World. Greetings from Mars.

Ответы [ 3 ]

12 голосов
/ 31 декабря 2011

С lxml в качестве бэкэнда синтаксического анализатора:

import html5lib

body = "<p>Hello World. Greetings from <strong>Mars.</strong></p>"
doc = html5lib.parse(body, treebuilder="lxml")
print doc.text_content()

Если честно, это фактически обман, поскольку он эквивалентен следующему (изменены только соответствующие части):

from lxml import html
doc = html.fromstring(body)
print doc.text_content()

Если вам действительно нужен механизм разбора html5lib:

from lxml.html import html5parser
doc = html5parser.fromstring(body)
print doc.xpath("string()")
3 голосов
/ 11 ноября 2013

Я использую html2text , который преобразует его в обычный текст (в формате Markdown).

from html2text import HTML2Text
handler = HTML2Text()

html = """Lorem <i>ipsum</i> dolor sit amet, <b>consectetur adipiscing</b> elit.<br>
          <br><h1>Nullam eget \r\ngravida elit</h1>Integer iaculis elit at risus feugiat:
          <br><br><ul><li>Egestas non quis \r\nlorem.</li><li>Nam id lobortis felis.
          </li><li>Sed tincidunt nulla.</li></ul>
          At massa tempus, quis \r\nvehicula odio laoreet.<br>"""
text = handler.handle(html)

>>> text
u'Lorem _ipsum_ dolor sit amet, **consectetur adipiscing** elit.\n\n  \n\n# Nullam eget gravida elit\n\nInteger iaculis elit at risus feugiat:\n\n  \n\n  * Egestas non quis lorem.\n  * Nam id lobortis felis.\n  * Sed tincidunt nulla.\nAt massa tempus, quis vehicula odio laoreet.\n\n'
0 голосов
/ 19 апреля 2017

Можно объединить результат метода itertext().

Пример:

import html5lib
d = html5lib.parseFragment(
        '<p>Hello World. Greetings from <strong>Mars.</strong></p>')
s = ''.join(d.itertext())
print(s)

Вывод:

Hello World. Greetings from Mars.
...