Учитывая гибкость HTML-кодов, разбор абзацев, видимых пользователем через браузер, кажется довольно нетривиальной задачей.
Пока у меня есть не очень надежное решение:
tree = lxml.etree.fromstring(html, lxml.etree.HTMLParser()) if isinstance(html, basestring) else html
for skiptag in ('//script', '//iframe', '//style',
'//link', '//meta', '//noscript', '//option'):
for node in tree.xpath(skiptag):
node.getparent().remove(node)
paragraphs = lxml.etree.tostring(tree, encoding=unicode, method='text')
Проблемы, с которыми я сталкиваюсь, связаны главным образом с тем, как бороться с ненормальностью (или, скажем, со свободными стилями).
Один довольно распространенный случай заключается в том, что многие абзацы записываются в одну строку (например, код ниже) в HTML, и мой код будет анализировать их в один абзац.
<p>bla, bla 1.</p><p><u><span class="colored"><strong>bla, bla 2.</strong></span></u></p><p>bla, bla. 3;</p><p>bla, bla. 3</p>
Мои вопросы:
- Есть ли в общем хорошие способы правильно разобрать абзацы?
- в этом конкретном случае, как мне оптимизировать мой код для правильного получения абзацев из одной строки HTML, учитывая, что не только
<p>
может представлять абзац, но и многие другие способы могут применяться к свободному стилю? *
- какой-нибудь общий совет?