7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Python

Scraping Halaman Web di Python Dengan Beautiful Soup: Pencarian dan Modifikasi DOM

Scroll to top
Read Time: 8 mins
This post is part of a series called Scraping Webpages in Python with Beautiful Soup.
Scraping Webpages in Python With Beautiful Soup: The Basics

Indonesian (Bahasa Indonesia) translation by Kurniawan Sugi Purwanto (you can also view the original English article)

Di tutorial terakhir, Anda belajar tentang dasar-dasar library Beautiful Soup. Selain navigasi DOM tree, Anda juga bisa mencari elemen dengan class atau id yang diberikan. Anda juga bisa memodifikasi DOM tree dengan library ini.

Di tutorial ini, Anda akan belajar beberapa metode berbeda yang akan membantu Anda dengan riset dan modifikasi. Kita akan melakukan scraping pada halaman Wikipedia yang sama tentang Python dari tutorial terbaru kita.

Filter untuk Pencarian di Tree

Beautiful Soup punya banyak metode untuk mencari DOM tree. Berbagai metode tersebut sangat mirip dan menggunakan jenis filter yang sama sebagai argumen. Oleh karenanya, masuk akal jika sebelumnya harus dipahami dengan benar tentang filter yang berbeda sebelum membaca tentang metode. Saya akan menggunakan metode find_all() yang sama untuk menjelaskan perbedaan antara filter-filter yang berbeda.

Filter paling sederhana yang bisa dimasukkan ke metode pencarian apa saja adalah string. Maka Beautiful Soup akan mencari ke dalam dokumen untuk menemukan tag yang secara tepat sesuai dengan stringnya.

Anda juga bisa memasukkan suatu ekspresi regular objek ke metode find_all(). Kali ini, Beautiful Soup akan memfilter tree dengan mencocokkan semua tag terhadap ekspresi regular yang diberikan.

Code ini akan mencari semua tag yang dimulai dengan huruf "h" dan diikuti suatu digit dari 1 sampai 6. Dengan kata lain, akan mencari semua tag heading di dalam dokumen.

Daripada menggunakan regex, Anda bisa mendapat hasil yang sama dengan memasukkan daftar semua tag yang Anda ingin Beautiful Soup mencocokkannya dengan dokumen.

Anda juga bisa memasukkan True sebagai parameter untuk metode find_all(). Kode tersebut akan mengembalikan semua tag yang dimaksud dalam dokumen. Keluaran di bawah ini menunjukkan bahwa ada 4.339 tag di halaman Wikipedia yang kita parsing.

Jika Anda masih tidak mampu menemukan apa yang Anda cari dengan filter-filter di atas, Anda bisa menetapkan fungsi Anda sendiri yang menjadikan suatu elemen sebagai satu-satunya argumennya. Fungsi tersebut juga harus mengembalikan True jika cocok dan False jika sebaliknya. Tergantung kebutuhan, Anda bisa membuat fungsinya sekompleks yang diperlukan untuk menyelesaikan tugasnya. berikut adalah suatu contoh yang sangat sederhana:

Fungsi di atas menelusuri halaman Wikipedia yang sama tentang Python dan mencari daftar tak tersusun yang memiliki lebih dari 20 anak.

Mencari DOM Tree Dengan Menggunakan Fungsi-Fungsi Internal

Salah satu metode paling terkenal untuk mencari di DOM adalah find_all(). Metode tersebut akan menelusuri semua turunan tag dan mengembalikan daftar semua turunan yang cocok dengan kriteria pencarian. Metode ini memiliki tanda sebagai berikut:

Argumen name adalah nama tag yang Anda ingin fungsi ini mencarinya sambil menelusuri tree. Anda boleh memberikan string, daftar, ekspresi regular, fungsi, atau nilai True sebagai sebuah nama.

Anda juga bisa memfilter elemen-elemen di DOM tree berdasarkan atribut-atribut yang berbeda seperti id, href, dsb. Anda juga bisa mendapat semua elemen dengan atribut khusus kendatipun nilainya menggunakan attribute=True. Mencari elemen dengan kelas khusus berbeda dibandingkan mencari aribut-atribut regular. Karena class adalah kata kunci yang reserved fi Python, Anda harus menggunakan argumen kata kunci class_ ketika mencari elemen dengan kelas khusus.

Anda bisa melihat dokumen ini punya 1.734 tag dengan atribut class dan 425 tag dengan atribut id. Jika Anda hanya butuh sedikit dari hasil awal, Anda bisa memasukkan angka ke metode itu sebagai nilai dari limit. Dengan memasukkan nilai ini, kita memberikan instruksi pada Beutiful Soup untuk berhenti mencari lebih banyak elemen setelah mendapatkan jumlah tertentu. Berikut contohnya:

Ketika Anda menggunakan metode find_all(), Beautiful Soup diberitahu untuk menelusuri semua turunan tag yang diberikan dan menemukan apa yang Anda cari. Terkadang, Anda ingin mencari satu elemen saja di turunan langsung suatu tag. Ini bisa dilakukan dengan memasukkan recursive=False ke metode find_all().

Jika Anda tertarik menemukan satu hasil saja untuk kueri pencarian tertentu, Anda bisa menggunakan metode find() untuk melakukan hal itu daripada memasukkan limit=1 ke dalam find_all(). Satu-satunya perbedaan antara hasil yang dikembalikan kedua metode tersebut adalah bahwa find_all() mengembalikan daftar yang berisi satu elemen saja sedangkan find() sekedar mengembalikan hasilnya.

Metode find() dan find_all() menelusuri semua turunan tag yang diberikan untuk mencari suatu elemen. Ada sepuluh metode lain yang sangat mirip dan bisa Anda gunakan untuk iterasi DOM tree ke arah yang berbeda.

Metode find_parent() dan find_parents() melintasi DOM tree untuk menemukan elemen yang diberikan. Sedangkan find_next_sibling() dan find_next_siblings() akan mengiterasi semua sibling elemen yang muncul setelah yang ada saat ini. Dengan cara serupa, metode find_previous_sibling() dan find_previous_siblings() akan mengiterasi semua sibling elemen yang muncul sebelum yang saat ini.

Metode find_next() dan find_all_next() akan mengiterasi semua tag dan string yang muncul setelah elemen saat ini. Dengan cara serupa, metode find_previous() dan find_all_previous() akan mengiterasi semua tag dan string yang muncul sebelum elemen saat ini.

Anda juga bisa mencari elemen dengan menggunakan selektor CSS dengan bantuan metode select(). Berikut ada beberapa contoh:

Memodifikasi Tree

Anda tidak hanya akan bisa menelusuri DOM tree untuk menemukan elemen, tetapi juga memodifikasinya. Sangat mudah mengganti nama tag dan memodifikasi atribut-atributnya.

Melanjutkan dari contoh terakhir kita, Anda bisa mengganti isi tag dengan string yang diberikan dengan menggunakan atribut .string. Jika Anda tidak ingin mengganti kontennya tetapi menambahkan sesuatu yang ekstra di akhir tag, gunakan metode append().

Dengan cara serupa, jika Anda ingin memasukkan sesuatu ke dalam tag di lokasi tertentu, Anda bisa menggunakan metode insert(). Parameter pertama untuk metode ini adalah posisi atau indeks yang ke situ Anda ingin memasukkan kontennta, dan parameter kedua adalah kontennya itu sendiri. Anda bisa menghapus semua konten di dalam tag dengan metode clear(). Yang tersisa adalah tag itu sendiri dan atributnya.

Di awal bagian ini, Anda memilih heading level dua dokumen dan mengubahnya ke heading level tiga. Dengan memakai selektor yang sama, sekarang akan ditunjukkan heading level dua berkutnya yang muncul setelah yang saat ini. Hal ini masuk akan karena heading yang asli bukan lagi heading level dua.

Heading yang asli sekarang bisa dipilih dengan h3:nth-of-type(2). Jika Anda ingin sepenuhnya menghapus dari tree suatu elemen atau tag berikut semua konten di dalamnya, Anda bisa menggunakan metode decompose().

Begitu Anda selesai mendekomposisi atau menghapus heading yang asli, heading di titik ketiga akan mengambil posisinya.

Jika Anda ingin menghapus suatu tag dan kontennya dari tree tetapi tidak ingin sepenuhnya memusnahkan tagnya, Anda bisa menggunakan metode extract(). Metode ini akan mengembalikan tagnya jika diekstrak. Sekarang Anda akan memiliki dua tree berbeda yang bisa di-parse. Root tree yang baru adalah tag yang baru saja Anda ekstrak.

Anda juga bisa mengganti tag di dalam tree dengan sesuatu yang lain sesuai pilihan Anda dengan menggunakan metode replace_with(). Metode ini akan mengembalikan tag atau string yang digantikannya. Anda bisa terbantu dengan ini jika Anda ingin meletakkan konten yang digantikan di bagian lain dokumen.

Dalam kode di atas, heading utama dokumen telah diganti dengan suatu tag b. Dokumennya tidak lagi punya tag h1, dan itulah mengapa sekarang print(soup.h1) menampilkan None.

Pemikiran Penutup

Setelah membaca dua tutorial dalam seri ini, Anda akan bisa mem-parse halaman web yang berbeda dan mengekstrak data penting dari dokumennya. Anda juga bisa memanggil halaman web aslinya, memodifikasinya sesuai kebutuhan, dan menyimpan versi yang telah dimodifikasi secara lokal.

Jika Anda ada pertanyaan terkait tutorial ini, beritahu saya lewat komentar di bawah ini.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.