Tôi hoàn toàn tôn trọng việc sử dụng Beautiful Soup để tải nội dung, nhưng nó có thể không phải là gói lý tưởng để có được nội dung được kết xuất trên một trang.
Tôi đã gặp sự cố tương tự khi tải nội dung được hiển thị hoặc nội dung hiển thị trong một trình duyệt thông thường. Đặc biệt, tôi có nhiều trường hợp có lẽ không điển hình để làm việc với một ví dụ đơn giản như vậy dưới đây. Trong trường hợp này, thẻ không hiển thị được lồng trong thẻ kiểu và không hiển thị trong nhiều trình duyệt mà tôi đã kiểm tra. Các biến thể khác tồn tại, chẳng hạn như xác định hiển thị cài đặt thẻ lớp thành không. Sau đó, sử dụng lớp này cho div.
<html>
<title> Title here</title>
<body>
lots of text here <p> <br>
<h1> even headings </h1>
<style type="text/css">
<div > this will not be visible </div>
</style>
</body>
</html>
Một giải pháp được đăng ở trên là:
html = Utilities.ReadFile('simple.html')
soup = BeautifulSoup.BeautifulSoup(html)
texts = soup.findAll(text=True)
visible_texts = filter(visible, texts)
print(visible_texts)
[u'\n', u'\n', u'\n\n lots of text here ', u' ', u'\n', u' even headings ', u'\n', u' this will not be visible ', u'\n', u'\n']
Giải pháp này chắc chắn có ứng dụng trong nhiều trường hợp và nói chung thực hiện công việc khá tốt nhưng trong html được đăng ở trên, nó vẫn giữ lại văn bản không được hiển thị. Sau khi tìm kiếm VẬY, một vài giải pháp đã được đưa ra ở đây BeautifulSoup get_text không loại bỏ tất cả các thẻ và JavaScript và ở đây Hiển thị HTML thành văn bản thuần túy bằng Python
Tôi đã thử cả hai giải pháp này: html2text và nltk.clean_html và rất ngạc nhiên trước kết quả thời gian nên nghĩ rằng chúng đảm bảo một câu trả lời cho hậu thế. Tất nhiên, tốc độ phụ thuộc nhiều vào nội dung của dữ liệu ...
Một câu trả lời ở đây từ @Helge là về việc sử dụng nltk cho mọi thứ.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Nó hoạt động thực sự tốt để trả về một chuỗi với html được kết xuất. Mô-đun nltk này nhanh hơn cả html2text, mặc dù có lẽ html2text mạnh mẽ hơn.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
không bao giờ biết về tính năng