Pada dasarnya, saya ingin menggunakan BeautifulSoup untuk mengambil teks yang terlihat di halaman web secara ketat . Misalnya, halaman web ini adalah kasus uji saya. Dan saya terutama ingin mendapatkan teks isi (artikel) dan bahkan mungkin beberapa nama tab di sana-sini. Saya telah mencoba saran dalam pertanyaan SO ini yang mengembalikan banyak <script>
tag dan komentar html yang tidak saya inginkan. Saya tidak dapat menemukan argumen yang saya perlukan untuk fungsi tersebut findAll()
agar mendapatkan teks yang terlihat di halaman web.
Jadi, bagaimana cara menemukan semua teks yang terlihat tidak termasuk skrip, komentar, css, dll.?
python
text
beautifulsoup
html-content-extraction
pengguna233864
sumber
sumber
soup.findAll(text=True)
tidak pernah tahu tentang fitur ituisinstance(element, Comment)
daripada mencocokkan dengan regex.soup = BeautifulSoup(html)
elif isinstance(element,bs4.element.Comment):
. Saya juga menambahkan 'meta' ke daftar orang tua.elif re.match(r"[\s\r\n]+",str(element)): return False
Jawaban yang disetujui dari @jbochi tidak berhasil untuk saya. Pemanggilan fungsi str () memunculkan pengecualian karena tidak bisa mengenkode karakter non-ascii dalam elemen BeautifulSoup. Berikut adalah cara yang lebih ringkas untuk memfilter halaman web contoh menjadi teks yang terlihat.
sumber
str(element)
gagal dengan masalah encoding, Anda harus mencobaunicode(element)
jika Anda menggunakan Python 2.sumber
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.
Salah satu solusi yang diposting di atas adalah:
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.
Ini bekerja sangat baik untuk mengembalikan string dengan html yang diberikan. Modul nltk ini lebih cepat daripada html2text, meskipun mungkin html2text lebih kuat.
sumber
Jika Anda peduli dengan kinerja, berikut cara lain yang lebih efisien:
soup.strings
adalah sebuah iterator, dan ini mengembalikanNavigableString
sehingga Anda dapat memeriksa nama tag induk secara langsung, tanpa melalui banyak pengulangan.sumber
Judul ada di dalam
<nyt_headline>
tag, yang bertumpuk di dalam<h1>
tag dan<div>
tag dengan id "artikel".Harus bekerja.
Badan artikel berada di dalam
<nyt_text>
tag, yang<div>
bertumpuk di dalam tag dengan id "articleBody". Di dalam<nyt_text>
elemen, teks itu sendiri berada di dalam<p>
tag. Gambar tidak ada di dalam<p>
tag tersebut. Sulit bagi saya untuk bereksperimen dengan sintaks, tetapi saya mengharapkan potongan yang berfungsi terlihat seperti ini.sumber
Sementara, saya sepenuhnya menyarankan menggunakan beautiful-soup secara umum, jika ada yang ingin menampilkan bagian yang terlihat dari html yang salah format (misalnya di mana Anda hanya memiliki segmen atau baris dari halaman web) untuk alasan apa pun, berikut ini akan menghapus konten di antara tag
<
dan>
:sumber
Menggunakan BeautifulSoup cara termudah dengan lebih sedikit kode hanya untuk mendapatkan string, tanpa baris kosong dan omong kosong.
sumber
Cara paling sederhana untuk menangani kasus ini adalah dengan menggunakan
getattr()
. Anda dapat menyesuaikan contoh ini dengan kebutuhan Anda:Ini akan menemukan elemen teks
"3.7"
, di dalam objek tag<span class="ratingsContent">3.7</span>
jika ada, namun defaultNoneType
jika tidak ada.sumber
sumber