Saya ingin mengekstrak teks dari file HTML menggunakan Python. Saya ingin pada dasarnya output yang sama saya akan dapatkan jika saya menyalin teks dari browser dan menempelkannya ke notepad.
Saya ingin sesuatu yang lebih kuat daripada menggunakan ekspresi reguler yang mungkin gagal pada HTML yang dibentuk dengan buruk. Saya telah melihat banyak orang merekomendasikan Beautiful Soup, tetapi saya punya beberapa masalah dalam menggunakannya. Untuk satu, ia mengambil teks yang tidak diinginkan, seperti sumber JavaScript. Juga, itu tidak menafsirkan entitas HTML. Misalnya, saya harapkan & # 39; dalam sumber HTML untuk dikonversi menjadi tanda kutip dalam teks, sama seperti jika saya menempelkan konten browser ke notepad.
Pembaruan html2text
terlihat menjanjikan. Ini menangani entitas HTML dengan benar dan mengabaikan JavaScript. Namun, itu tidak persis menghasilkan teks biasa; itu menghasilkan penurunan harga yang kemudian harus diubah menjadi teks biasa. Muncul tanpa contoh atau dokumentasi, tetapi kode terlihat bersih.
Pertanyaan-pertanyaan Terkait:
sumber
Jawaban:
html2text adalah program Python yang melakukan pekerjaan dengan cukup baik.
sumber
Sepotong kode terbaik yang saya temukan untuk mengekstraksi teks tanpa mendapatkan javascript atau tidak menginginkan hal-hal:
Anda hanya perlu menginstal BeautifulSoup sebelum:
sumber
text = soup.get_text(separator=' ')
soup.get_text()
saya gunakansoup.body.get_text()
, sehingga saya tidak mendapatkan teks dari<head
elemen>, seperti judul.from urllib.request import urlopen
CATATAN: NTLK tidak lagi mendukung
clean_html
fungsiJawaban asli di bawah, dan alternatif di bagian komentar.
Gunakan NLTK
Saya menghabiskan 4-5 jam untuk memperbaiki masalah dengan html2text. Untungnya saya bisa menemukan NLTK.
Ini bekerja secara ajaib.
sumber
raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Menemukan diri saya menghadapi masalah yang sama hari ini. Saya menulis parser HTML yang sangat sederhana untuk menghapus konten yang masuk dari semua markup, mengembalikan teks yang tersisa dengan hanya memformat minimum.
sumber
&
tidak akan dikonversi menjadi&
, bukan?from html.parser import HTMLParser
Ini adalah versi jawaban xperroni yang sedikit lebih lengkap. Ini melompati skrip dan bagian gaya dan menerjemahkan charrefs (misalnya, & # 39;) dan entitas HTML (misalnya, & amp;).
Ini juga termasuk konverter invers plain-text-to-html sepele.
sumber
Saya tahu sudah ada banyak jawaban, tetapi solusi paling elegan dan pythonic yang saya temukan dijelaskan, sebagian, di sini .
Memperbarui
Berdasarkan komentar Fraser, berikut adalah solusi yang lebih elegan:
sumber
text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
Anda dapat menggunakan metode html2text di perpustakaan stripogram juga.
Untuk menginstal stripogram, jalankan sudo easy_install stripogram
sumber
Ada perpustakaan pola untuk penambangan data.
http://www.clips.ua.ac.be/pages/pattern-web
Anda bahkan dapat memutuskan tag mana yang akan disimpan:
sumber
PyParsing melakukan pekerjaan dengan baik. Wiki PyParsing terbunuh jadi di sini ada lokasi lain di mana ada contoh penggunaan PyParsing ( contoh tautan ). Salah satu alasan untuk menginvestasikan sedikit waktu dengan parsing adalah bahwa ia juga telah menulis sebuah panduan singkat O'Reilly Short Cut yang sangat terorganisir dengan baik yang juga murah.
Karena itu, saya banyak menggunakan BeautifulSoup dan tidak sulit untuk berurusan dengan masalah entitas, Anda dapat mengonversinya sebelum Anda menjalankan BeautifulSoup.
Semoga berhasil
sumber
Ini bukan solusi Python, tetapi itu akan mengkonversi teks yang akan dihasilkan Javascript menjadi teks, yang menurut saya penting (EG google.com). Tautan peramban (bukan Lynx) memiliki mesin Javascript, dan akan mengonversi sumber ke teks dengan opsi -dump.
Jadi Anda bisa melakukan sesuatu seperti:
sumber
Alih-alih modul HTMLParser, periksa htmllib. Ini memiliki antarmuka yang sama, tetapi lebih banyak bekerja untuk Anda. (Ini cukup kuno, jadi tidak banyak membantu dalam hal menyingkirkan javascript dan css. Anda bisa membuat kelas turunan, tetapi dan menambahkan metode dengan nama seperti start_script dan end_style (lihat dokumentasi python untuk perincian), tetapi sulit untuk melakukan ini secara andal untuk html cacat.) Bagaimanapun, ini adalah sesuatu yang sederhana yang mencetak teks biasa ke konsol
sumber
Saya merekomendasikan Paket Python yang disebut Goose-extractor Goose akan mencoba mengekstrak informasi berikut:
Teks utama dari sebuah artikel Gambar utama dari artikel Setiap film Youtube / Vimeo yang disematkan dalam artikel Meta Deskripsi Meta tag
Lebih lanjut: https://pypi.python.org/pypi/goose-extractor/
sumber
jika Anda membutuhkan lebih banyak kecepatan dan kurang akurasi maka Anda bisa menggunakan lxml mentah.
sumber
instal html2text menggunakan
kemudian,
sumber
Saya tahu sudah ada banyak jawaban di sini, tetapi saya pikir newspaper3k juga layak disebutkan. Baru-baru ini saya perlu menyelesaikan tugas serupa mengekstraksi teks dari artikel di web dan perpustakaan ini telah melakukan pekerjaan yang sangat baik untuk mencapai ini sejauh ini dalam pengujian saya. Ini mengabaikan teks yang ditemukan di item menu dan bilah samping serta semua JavaScript yang muncul pada halaman sesuai permintaan OP.
Jika Anda sudah mengunduh file HTML, Anda dapat melakukan sesuatu seperti ini:
Bahkan memiliki beberapa fitur NLP untuk merangkum topik artikel:
sumber
Sup yang indah memang mengubah entitas html. Ini mungkin pilihan terbaik Anda mengingat HTML sering bermasalah dan diisi dengan masalah enkode unicode dan html. Ini adalah kode yang saya gunakan untuk mengonversi html ke teks mentah:
sumber
Pilihan lain adalah menjalankan html melalui browser web berbasis teks dan membuangnya. Misalnya (menggunakan Lynx):
Ini dapat dilakukan dalam skrip python sebagai berikut:
Itu tidak akan memberi Anda persis hanya teks dari file HTML, tetapi tergantung pada kasus penggunaan Anda mungkin lebih disukai untuk output dari html2text.
sumber
Yang paling berhasil bagi saya adalah prasasti.
https://github.com/weblyzard/inscriptis
Hasilnya sangat bagus
sumber
Solusi non-python lain: Libre Office:
Alasan saya lebih suka yang satu ini daripada alternatif lain adalah bahwa setiap paragraf HTML akan dikonversi menjadi satu baris teks (tidak ada jeda baris), yang adalah apa yang saya cari. Metode lain membutuhkan pasca pemrosesan. Lynx memang menghasilkan output yang bagus, tetapi tidak persis apa yang saya cari. Selain itu, Libre Office dapat digunakan untuk mengonversi dari semua jenis format ...
sumber
Adakah yang sudah mencoba
bleach.clean(html,tags=[],strip=True)
dengan pemutih ? ini bekerja untuk saya.sumber
Saya mendapatkan hasil yang baik dengan Apache Tika . Tujuannya adalah ekstraksi metadata dan teks dari konten, karenanya parser yang mendasarinya disetel sesuai di luar kotak.
Tika dapat dijalankan sebagai server , mudah dijalankan / disebarkan dalam wadah Docker, dan dari sana dapat diakses melalui binding Python .
sumber
dengan cara yang sederhana
kode ini menemukan semua bagian dari html_text dimulai dengan '<' dan diakhiri dengan '>' dan ganti semua yang ditemukan oleh string kosong
sumber
@ PeYoTIL's jawaban menggunakan BeautifulSoup dan menghilangkan gaya dan konten skrip tidak bekerja untuk saya. Saya mencoba menggunakan
decompose
bukanextract
tetapi masih tidak berhasil. Jadi saya buat sendiri yang juga memformat teks menggunakan<p>
tag dan mengganti<a>
tag dengan tautan href. Juga mengatasi tautan di dalam teks. Tersedia di intisari ini dengan dokumen uji yang disematkan.sumber
get_text
hanya tidak memotongnya.Dalam Python 3.x Anda dapat melakukannya dengan cara yang sangat mudah dengan mengimpor paket 'imaplib' dan 'email'. Meskipun ini adalah posting yang lebih lama tetapi mungkin jawaban saya dapat membantu pendatang baru di posting ini.
Sekarang Anda dapat mencetak variabel tubuh dan itu akan berada dalam format plaintext :) Jika cukup baik untuk Anda maka akan lebih baik untuk memilihnya sebagai jawaban yang diterima.
sumber
text/plain
bagian dari email jika orang lain meletakkannya di sana. Itu tidak melakukan apa pun untuk mengubah HTML menjadi plaintext, dan tidak melakukan apa pun yang berguna jika Anda mencoba untuk mengkonversi HTML dari, katakanlah, situs web.Anda hanya dapat mengekstrak teks dari HTML dengan BeautifulSoup
sumber
Sementara banyak orang yang disebutkan menggunakan regex untuk menghapus tag html, ada banyak kelemahan.
sebagai contoh:
Harus diuraikan ke:
Berikut cuplikan yang saya buat, Anda dapat menyesuaikannya dengan kebutuhan spesifik Anda, dan itu berfungsi seperti pesona
sumber
Contoh lain menggunakan BeautifulSoup4 di Python 2.7.9+
termasuk:
Kode:
Dijelaskan:
Baca di data url sebagai html (menggunakan BeautifulSoup), hapus semua elemen skrip dan gaya, dan dapatkan juga teks menggunakan .get_text (). Pecah menjadi beberapa baris dan hapus spasi awal dan akhir pada masing-masing, kemudian pisahkan multi-headline menjadi satu baris setiap potongan = (phrase.strip () untuk baris dalam baris untuk frase dalam line.split ("")). Kemudian menggunakan text = '\ n'.join, drop baris kosong, akhirnya kembali sebagai utf-8 yang disetujui.
Catatan:
Beberapa sistem yang dijalankan ini akan gagal dengan https: // koneksi karena masalah SSL, Anda dapat mematikan verifikasi untuk memperbaiki masalah itu. Contoh perbaikan: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/
Python <2.7.9 mungkin memiliki masalah menjalankan ini
text.encode ('utf-8') dapat meninggalkan penyandian yang aneh, mungkin ingin mengembalikan str (teks) saja.
sumber
Berikut kode yang saya gunakan secara teratur.
Saya harap itu membantu.
sumber
Komentar penulis LibreOffice pantas karena aplikasi dapat menggunakan makro python. Tampaknya menawarkan banyak manfaat baik untuk menjawab pertanyaan ini dan melanjutkan basis makro LibreOffice. Jika resolusi ini adalah implementasi satu kali, alih-alih digunakan sebagai bagian dari program produksi yang lebih besar, membuka HTML dalam penulis dan menyimpan halaman sebagai teks akan menyelesaikan masalah yang dibahas di sini.
sumber
Perl way (maaf Bu, aku tidak akan pernah melakukannya dalam produksi).
sumber