Saya benar-benar menghormati penggunaan Beautiful Soup untuk mendapatkan konten yang dirender, tetapi itu mungkin bukan paket yang ideal untuk memperoleh konten yang dirender di halaman.
Saya mengalami masalah serupa untuk mendapatkan konten yang dirender, atau konten yang terlihat di browser biasa. Secara khusus saya memiliki banyak kasus yang mungkin tidak biasa untuk dikerjakan dengan contoh sederhana di bawah ini. Dalam kasus ini, tag yang tidak dapat ditampilkan berada di dalam tag gaya, dan tidak terlihat di banyak browser yang telah saya periksa. Variasi lain yang ada seperti menentukan pengaturan tag kelas ditampilkan ke tidak ada. Kemudian gunakan kelas ini untuk 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>
Salah satu solusi yang diposting di atas adalah:
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']
Solusi ini tentu saja memiliki aplikasi dalam banyak kasus dan melakukan pekerjaan dengan cukup baik secara umum tetapi dalam html yang diposting di atas tetap mempertahankan teks yang tidak ditampilkan. Setelah mencari SO beberapa solusi muncul di sini BeautifulSoup get_text tidak menghapus semua tag dan JavaScript dan di sini Rendered HTML menjadi teks biasa menggunakan Python
Saya mencoba kedua solusi ini: html2text dan nltk.clean_html dan terkejut dengan hasil pengaturan waktu, jadi saya pikir mereka menjamin jawaban untuk anak cucu. Tentu saja kecepatannya sangat bergantung pada isi datanya ...
Satu jawaban di sini dari @Helge adalah tentang menggunakan nltk untuk semua hal.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Ini bekerja sangat baik untuk mengembalikan string dengan html yang diberikan. Modul nltk ini lebih cepat daripada html2text, meskipun mungkin html2text lebih kuat.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
tidak pernah tahu tentang fitur itu