Разбор абзацев в одной строке HTML с использованием Python - PullRequest
0 голосов
/ 07 ноября 2011

Учитывая гибкость 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> может представлять абзац, но и многие другие способы могут применяться к свободному стилю? *
  • какой-нибудь общий совет?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Используйте метод xpath для циклического перебора всех абзацев:

for para in tree.xpath("//p"):
    ...
1 голос
/ 07 ноября 2011

Посмотрите на html2text .

Возможно, это не совсем то, что вам нужно, но это всего лишь 500-строчный сценарий, поэтому его довольно легко адаптировать к вашим конкретным потребностям.

...