Я полностью уважаю использование Beautiful Soup для получения визуализированного контента, но, возможно, это не идеальный пакет для получения визуализированного контента на странице.
У меня была аналогичная проблема с получением визуализированного контента или видимого контента в обычном браузере. В частности, у меня было много, возможно, нетипичных случаев для работы с таким простым примером, приведенным ниже. В этом случае неотображаемый тег вложен в тег стиля и не отображается во многих проверенных мной браузерах. Существуют и другие варианты, такие как определение для параметра отображения тега класса значения none. Затем используя этот класс для 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>
Одно из решений, опубликованных выше:
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']
Это решение, безусловно, имеет приложения во многих случаях и в целом выполняет свою работу достаточно хорошо, но в размещенном выше html оно сохраняет текст, который не отображается. После поиска SO здесь появилась пара решений BeautifulSoup get_text не удаляет все теги и JavaScript, а здесь визуализированный HTML в обычный текст с использованием Python
Я попробовал оба этих решения: html2text и nltk.clean_html и был удивлен результатами по времени, поэтому подумал, что они гарантируют ответ для потомков. Конечно, скорости сильно зависят от содержимого данных ...
Один из ответов здесь от @Helge касался использования nltk всего.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Очень хорошо получилось вернуть строку с визуализированным html. Этот модуль nltk был быстрее, чем даже html2text, хотя, возможно, html2text более надежен.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
никогда не знал об этой особенности