Я повністю з повагою використовую Beautiful Soup для отримання візуалізованого контенту, але це може бути не ідеальним пакетом для придбання викладеного контенту на сторінці.
У мене була схожа проблема з отриманням виведеного вмісту або видимого вмісту в звичайному браузері. Зокрема, у мене було багато, мабуть, нетипових випадків, щоб працювати з таким простим прикладом нижче. У цьому випадку тег, який не відображається, вкладений у тег стилю та не видно у багатьох браузерах, які я перевірив. Існують й інші варіанти, такі як визначення відображення налаштування тегів класу для жодних. Потім використовуючи цей клас для діл.
<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-файлі він зберігає текст, який не надається. Після пошуку ТАК тут з'явилися пару рішень. 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)
ніколи не знав про цю особливість