python [lxml] - очистка HTML-тегов - PullRequest
12 голосов
/ 01 июня 2010
from lxml.html.clean import clean_html, Cleaner
    def clean(text):
        try:        
            cleaner = Cleaner(scripts=True, embedded=True, meta=True, page_structure=True, links=True, style=True,
                      remove_tags = ['a', 'li', 'td'])
            print (len(cleaner.clean_html(text))- len(text))
            return cleaner.clean_html(text) 
        except:
            print 'Error in clean_html'
            print sys.exc_info()
            return text

Я собрал вышеупомянутый (уродливый) код, когда мои первые набеги на землю питона. Я пытаюсь использовать lxml cleaner, чтобы очистить пару html-страниц, так что, в конце концов, я просто остался с текстом и ничем иным - но, как я мог, вышеприведенное, похоже, не работает как таковое, я до сих пор осталось небольшое количество разметки (и, похоже, она не повреждена в формате html), и в частности ссылки, которые не удаляются, несмотря на аргументы, которые я использую в remove_tags и links=True

есть идеи, что происходит, возможно, я неправильно лаю дерево с помощью lxml? я думал, что это способ пойти с разбором HTML в Python?

Ответы [ 3 ]

13 голосов
/ 17 марта 2011

Не уверен, что этот метод существовал в то время, когда вы задавали свой вопрос, но если вы пройдете через

document = lxml.html.document_fromstring(html_text)
raw_text = document.text_content()

Это должно вернуть вам все текстовое содержимое в HTML-документе, за вычетом всей разметки.

12 голосов
/ 29 мая 2014

решение из Дэвид объединяет текст без разделителя:

   import lxml.html
   document = lxml.html.document_fromstring(html_string)
   # internally does: etree.XPath("string()")(document)
   print document.text_content()

но этот мне помог - конкатенация так, как мне нужно:

   from lxml import etree
   print "\n".join(etree.XPath("//text()")(document))
5 голосов
/ 01 июня 2010

Я думаю, вам стоит проверить Прекрасный суп . Воспользуйтесь советом этой статьи и удалите элементы HTML следующим образом:

from BeautifulSoup import BeautifulSoup

''.join(BeautifulSoup(page).findAll(text=True))

Где page - ваша строка html.

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

...