2011-12-18 38 views
16

Tôi đang phân tích cú pháp tài liệu html bằng cách sử dụng thư viện http://lxml.de/. Cho đến nay tôi đã tìm ra cách tách thẻ từ một tài liệu html In lxml, how do I remove a tag but retain all contents? nhưng phương pháp được mô tả trong bài đăng đó để lại tất cả văn bản, tước các thẻ bằng cách xóa bỏ tập lệnh thực tế. Tôi cũng đã tìm thấy một tài liệu tham khảo lớp học để lxml.html.clean.Cleaner http://lxml.de/api/lxml.html.clean.Cleaner-class.html nhưng điều này rõ ràng là bùn như thế nào để thực sự sử dụng lớp học để làm sạch tài liệu. Bất kỳ sự giúp đỡ nào, có lẽ một ví dụ ngắn sẽ hữu ích cho tôi!Xóa tất cả thẻ javascript và thẻ kiểu từ html bằng python và mô-đun lxml

Trả lời

45

Dưới đây là một ví dụ để làm những gì bạn muốn. Đối với tài liệu HTML, Cleaner là giải pháp tổng quát tốt hơn cho vấn đề hơn là sử dụng strip_elements, bởi vì trong những trường hợp như thế này bạn muốn loại bỏ nhiều hơn chỉ là thẻ <script>; bạn cũng muốn loại bỏ những thứ như thuộc tính onclick=function() trên các thẻ khác.

#!/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'))) 

Bạn có thể nhận danh sách các tùy chọn bạn có thể đặt trong lxml.html.clean.Cleaner documentation; một số tùy chọn bạn chỉ có thể thiết lập để True hoặc False (mặc định) và những người khác tham gia một danh sách như:

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

Lưu ý rằng sự khác biệt giữa kill vs remove:

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

Tuyệt vời, cảm ơn bạn rất nhiều! –

+0

Tôi đã ra hầu hết trong ngày, nên đã mang nó lên trước đó tôi đoán. Tôi chỉ nhận thấy sau khi chơi với điều này mà những điều kill_tags dường như không thực sự làm bất cứ điều gì ví dụ tôi đã thêm 'clean.kill_tags = ('img', 'noscript', 'a')' nhưng những thẻ vẫn còn trong tài liệu đầu ra , phần còn lại của ví dụ trên hoạt động như mong đợi, nó chỉ sau khi chơi với các thẻ giết mà tôi nhận thấy điều này. –

+0

Lưu ý trong ví dụ của tôi, tôi sử dụng dấu ngoặc vuông, không phải dấu ngoặc đơn. Bạn nên thử '['img', 'noscript', 'a']'. Các dấu ngoặc vuông biểu thị một danh sách, trong khi dấu ngoặc đơn biểu thị một tuple (trong ví dụ của bạn là một bộ ba phần tử). Tuples và danh sách không giống nhau chút nào. – aculich

4

Bạn có thể sử dụng phương pháp strip_elements để loại bỏ kịch bản, sau đó sử dụng strip_tags phương pháp để loại bỏ các thẻ khác:

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

Đối với một tài liệu HTML khi loại bỏ kịch bản bạn muốn thoát khỏi tất cả các javascript, không chỉ là ''