Całkowicie szanuję używanie Beautiful Soup do renderowania treści, ale może to nie być idealny pakiet do pozyskiwania renderowanej treści na stronie.
Miałem podobny problem, aby uzyskać renderowaną treść lub widoczną zawartość w typowej przeglądarce. W szczególności miałem wiele być może nietypowych przypadków do pracy z tak prostym przykładem poniżej. W tym przypadku niewyświetlalny znacznik jest zagnieżdżony w znaczniku stylu i nie jest widoczny w wielu przeglądarkach, które sprawdziłem. Istnieją inne odmiany, takie jak zdefiniowanie ustawienia wyświetlania znacznika klasy na none. Następnie używając tej klasy dla 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>
Jednym z opublikowanych powyżej rozwiązań jest:
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']
To rozwiązanie z pewnością ma aplikacje w wielu przypadkach i generalnie działa całkiem dobrze, ale w zamieszczonym powyżej html zachowuje tekst, który nie jest renderowany. Po przeszukaniu tak pojawiło się kilka rozwiązań BeautifulSoup get_text nie usuwa wszystkich tagów i JavaScript, a tutaj Rendered HTML na zwykły tekst za pomocą Pythona
Wypróbowałem oba te rozwiązania: html2text i nltk.clean_html i byłem zaskoczony wynikami synchronizacji, więc pomyślałem, że uzasadniają odpowiedź dla potomności. Oczywiście prędkości w dużym stopniu zależą od zawartości danych ...
Jedna odpowiedź od @Helge dotyczyła używania nltk wszystkich rzeczy.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Zwrócenie ciągu znaków z wyrenderowanym kodem HTML działało naprawdę dobrze. Ten moduł nltk był szybszy niż nawet html2text, chociaż być może html2text jest bardziej niezawodny.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
że nigdy nie wiedziałem o tej funkcji