2010-06-01 14 views
11
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 

Я собрал вышеуказанный (уродливый) код в качестве моих начальных набегов на землю python. Я пытаюсь использовать очиститель lxml, чтобы очистить пару html-страниц, поэтому в конце я просто оставил текст и ничего больше - но попробуйте, как я мог, выше, похоже, не работает как таковой, я по-прежнему остаются с substial количеством разметки (и оно не кажется, сломан HTML), и в частности, ссылки, которые не получают удалены, несмотря на аргументы я использую в remove_tags и links=Truepython [lxml] - очистка html-тегов

любой идея, что происходит, возможно, im лаять неправильное дерево с lxml? Я думал, что это способ пойти с синтаксисом html в python?

+0

Я не в состоянии воспроизвести проблему с помощью HTTP : //stackoverflow.com/questions/2950131/python-lxml-cleaning-out-html-tags/2950223#2950223 в качестве входных данных. Не могли бы вы предоставить образец html и желаемый результат? – unutbu

+0

~ unutbu это самое странное - у меня есть целая база данных, где этот код не работает - и все же, похоже, что сейчас работает нормально? (вы что-то делали :)?) но в то время как im на нем, любая идея, как вы могли бы также извлечь текст ссылки при удалении ссылки (потому что atm оставляет текст ссылок). –

+0

@sadhu_: 'remove_tags' удаляет только теги; он оставляет своих детей и текст. Используйте «kill_tags» для удаления всего дерева. – jfs

ответ

5

Я думаю, вы должны проверить Beautiful Soup. Используйте советы от this article и лишить HTML элементов следующим образом:

from BeautifulSoup import BeautifulSoup 

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

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

Если вам нужно уточнить подробное описание, вы можете проверить погружение в тематическое исследование Python по телефону HTML parsing.

+3

Кажется, что BS устарел (а googling, похоже, предполагает, что lxml - это путь вперед ..), поэтому в идеале я хотел изучить некоторый lxml [поскольку документация слегка запуталась ..] –

+0

BS rock! С 4.0 rc out (несколько месяцев назад) вы можете использовать парсер из 'lxml' или' html5lib' и обернуть их в хороший BS api. – Sergio

12

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

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

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

+0

Посмотрите ответ Роберта ниже - ссылка для ленивых http://stackoverflow.com/a/23929354/9908 – David

8

раствор из David присоединяет текст без сепараторов:

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)) 
+1

Это гораздо полезнее. – David