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
16
A
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).
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 ''
Doskonale, dziękuję bardzo! –
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. –
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