2011-12-18 19 views
16

Parsuję dokument HTML przy użyciu biblioteki http://lxml.de/. Do tej pory wymyśliłem, jak usunąć znaczniki z dokumentu html In lxml, how do I remove a tag but retain all contents?, ale metoda opisana w tym poście pozostawia cały tekst, usuwając tagi bez usuwania faktycznego skryptu. Znalazłem również odwołanie do klasy lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html, ale jest to jasne, jak błoto, jak faktycznie używać klasy do czyszczenia dokumentu. Każda pomoc, być może krótki przykład, będzie mi pomocna!Usunięcie wszystkich znaczników javascript i znaczników stylu z html przy użyciu pythona i modułu lxml

Odpowiedz

45

Poniżej jest przykład na to, co chcesz. W przypadku dokumentu HTML, Cleaner jest lepszym ogólnym rozwiązaniem problemu niż użycie strip_elements, ponieważ w takich przypadkach chcesz usunąć więcej niż tylko znacznik <script>; chcesz także pozbyć się atrybutów takich jak onclick=function() na innych tagach.

#!/usr/bin/env python 

import lxml 
from lxml.html.clean import Cleaner 

cleaner = Cleaner() 
cleaner.javascript = True # This is True because we want to activate the javascript filter 
cleaner.style = True  # This is True because we want to activate the styles & stylesheet filter 

print "WITH JAVASCRIPT & STYLES" 
print lxml.html.tostring(lxml.html.parse('http://www.google.com')) 
print "WITHOUT JAVASCRIPT & STYLES" 
print lxml.html.tostring(cleaner.clean_html(lxml.html.parse('http://www.google.com'))) 

Możesz otrzymać listę opcji, które możesz ustawić w lxml.html.clean.Cleaner documentation; Niektóre opcje można po prostu ustawić na True lub False (domyślnie) i innymi wziąć listę:

cleaner.kill_tags = ['a', 'h1'] 
cleaner.remove_tags = ['p'] 

że różnica między kill vs usunięcia:

remove_tags: 
    A list of tags to remove. Only the tags will be removed, their content will get pulled up into the parent tag. 
kill_tags: 
    A list of tags to kill. Killing also removes the tag's content, i.e. the whole subtree, not just the tag itself. 
allow_tags: 
    A list of tags to include (default include all). 
+1

Doskonale, dziękuję bardzo! –

+0

Byłem przez większość dnia, powinienem przynieść to wcześniej, tak myślę. Właśnie zauważyłem po zabawie z tym, że rzeczy kill_tags nie wydają się robić nic na przykład Dodałem 'cleaner.kill_tags = ('img', 'noscript', 'a')' ale te znaczniki pozostają w dokumencie wyjściowym , reszta powyższego przykładu działa zgodnie z oczekiwaniami, po prostu zauważyłam to po graniu tagami kill. –

+0

Uwaga w moim przykładzie Używam nawiasów kwadratowych, a nie nawiasów. Powinieneś wypróbować '['img', 'noscript', 'a']'. Nawiasy kwadratowe oznaczają listę, podczas gdy nawiasy oznaczają krotkę (w twoim przykładzie krotka 3-elementowa). Krotki i listy nie są takie same. – aculich

4

Można użyć metody strip_elements usunąć skrypty, a następnie użyć strip_tags sposób, aby usunąć inne tagi:

etree.strip_elements(fragment, 'script') 
etree.strip_tags(fragment, 'a', 'p') # and other tags that you want to remove 
+1

Do dokumentu HTML podczas usuwania skryptów, które chcesz pozbyć wszystkie JavaScript, a nie tylko ''