Belajar Scrapling - Selection Methods Lanjutan
Episode 5 of 23

Belajar Scrapling - Selection Methods Lanjutan

Menguasai seleksi di luar CSS dan XPath: find_by_text untuk mencari elemen berdasarkan isi teks, find_by_regex untuk pola teks, pencarian elemen similar dengan seleksi relatif, serta filter berbasis kondisi atribut dan struktur untuk seleksi yang presisi.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Di episode 4 kalian sudah menguasai seleksi dasar: .css(), .xpath(), .get(), .getall(), dan ekstraksi teks serta atribut. Tapi ada kalanya selector biasa tidak cukup — misalnya elemen tanpa class yang jelas, atau harus ditemukan berdasarkan isi teksnya. Di episode inilah seleksi lanjutan berperan.

Episode ini membahas find_by_text, find_by_regex, pencarian elemen similar, dan seleksi berbasis filter — empat senjata yang membuat kalian presisi dalam kondisi DOM yang tidak bersahabat.

Kenapa Seleksi Lanjutan Diperlukan

CSS dan XPath unggul saat struktur HTML rapi. Tapi dunia nyata sering berbeda: class dibuat acak oleh framework, elemen tanpa atribut yang jelas, atau teks menjadi satu-satunya petunjuk yang stabil. Contoh nyatanya, halaman punya sekumpulan tombol yang semuanya memakai class yang sama dan hanya bisa dibedakan dari teksnya.

Di kondisi seperti ini, memilih "tombol yang teksnya Login" lebih masuk akal daripada menebak selector struktur. Scrapling menyediakan metode pencarian berbasis teks yang dirancang khusus untuk kasus ini.

Mencari Elemen Berdasarkan Teks: find_by_text

find_by_text menemukan elemen berdasarkan isi teksnya. Metode ini tersedia di Adaptor dan bisa dipanggil langsung pada tree atau hasil seleksi:

Pythonfind-by-text.py
from scrapling import Adaptor
 
html = """
<button class="btn">Login</button>
<button class="btn">Daftar</button>
"""
 
page = Adaptor(html)
 
login = page.find_by_text("Login")
print(login.text)

Hasilnya elemen yang berisi teks persis "Login". Untuk kontrol lebih fleksibel, ada parameter yang bisa dikombinasikan:

Pythonfind-by-text-options.py
page = Adaptor(html)
 
login = page.find_by_text("Login", case_sensitive=False)
dua = page.find_by_text("Log", first_only=False)

case_sensitive mengontrol pencocokan huruf besar-kecil, dan first_only mengatur apakah mengembalikan elemen pertama saja atau semua kecocokan. Saat teksnya dobel dan semua elemen relevan, set first_only=False lalu iterasi hasilnya.

Mencari Elemen dengan Pola Teks: find_by_regex

Ketika teksnya bervariasi tapi berpola — nomor, harga, tanggal — find_by_regex adalah jawabannya. Ia menerima pola regex dan menemukan elemen yang teksnya cocok dengan pola tersebut:

Pythonfind-by-regex.py
import re
from scrapling import Adaptor
 
html = """
<div>Diskon 10%</div>
<div>Diskon 25%</div>
<div>Lainnya</div>
"""
 
page = Adaptor(html)
 
diskon = page.find_by_regex(re.compile(r"Diskon \d+%"))
print([item.text for item in diskon])

Pola Diskon \d+% cocok dengan semua div berisi angka persentase diskon. Ini sangat berguna untuk mengekstrak elemen yang pola teksnya konsisten meski strukturnya berbeda-beda — misalnya harga di berbagai format, atau nomor pesanan.

page.find_by_text("Login")

Mencari Elemen Similar

Masalah klasik lainnya: kalian sudah menemukan satu elemen yang tepat, tapi butuh elemen lain yang polanya mirip di halaman yang sama. Scrapling menyediakan pencarian elemen similar — elemen dengan struktur yang menyerupai elemen acuan. Pendekatannya adalah mencari berdasarkan template struktur:

Pythonfind-similar.py
from scrapling import Adaptor
 
html = """
<div class="card"><h2>Produk A</h2><span class="harga">Rp 100.000</span></div>
<div class="card"><h2>Produk B</h2><span class="harga">Rp 250.000</span></div>
<div class="banner">Promosi</div>
"""
 
page = Adaptor(html)
card_pertama = page.css("div.card").get()
mirip = page.find_similar(card_pertama)
print(len(mirip))

find_similar menemukan elemen-elemen yang strukturnya serupa dengan card pertama — di sini akan ketemu card kedua, dan banner yang strukturnya beda akan dilewati. Teknik ini andal saat daftar produk atau artikel tidak konsisten secara struktur antar item.

Filter Berbasis Kondisi Atribut

Metode .filter() menyaring hasil seleksi berdasarkan kondisi atribut. Kalian bisa menyaring dari hasil seleksi yang sudah ada:

Pythonfilter-atribut.py
from scrapling import Adaptor
 
html = """
<a href="/eksternal" target="_blank">Link 1</a>
<a href="/internal/1">Link 2</a>
<a href="/internal/2" data-utama="true">Link 3</a>
"""
 
page = Adaptor(html)
link_internal = page.css("a").filter(
    href="/internal/", regex=True
)
utama = page.css("a").filter(
    {"data-utama": "true"}
)

Contoh pertama menyaring link yang href-nya memuat pola /internal/ lewat mode regex. Contoh kedua menyaring berdasarkan pasangan atribut-nilai: hanya elemen dengan data-utama="true" yang lulus. Filter bisa memakai string tunggal, regex, atau dictionary multi-kondisi.

Filter Berbasis Struktur

Filter tidak hanya soal atribut — bisa juga kondisi struktural, misalnya memilih elemen yang memiliki atau tidak memiliki elemen turunan tertentu. Ini meniru kekuatan XPath tanpa menulis ekspresi panjang:

Pythonfilter-struktur.py
from scrapling import Adaptor
 
html = """
<div class="produk"><img src="a.jpg"><h3>Nama A</h3></div>
<div class="produk"><h3>Nama B</h3></div>
"""
 
page = Adaptor(html)
punya_gambar = page.css("div.produk").filter("img")
print(len(punya_gambar))

Meneruskan selector string "img" ke filter berarti "hanya pertahankan elemen yang mengandung img". Hasilnya hanya produk pertama yang lolos. Pola ini menyingkirkan item yang tidak lengkap — misalnya produk tanpa foto atau tanpa harga.

Menggabungkan Teknik dalam Satu Alur

Semua metode di atas bukan silo; mereka paling bertenaga saat digabung. Contoh nyata: mencari semua harga diskon di dalam elemen yang mirip:

Pythongabungan.py
import re
from scrapling import Adaptor
 
page = Adaptor(html)
produk_pertama = page.css("div.card").get()
kartu_mirip = page.find_similar(produk_pertama)
 
for kartu in kartu_mirip:
    harga = kartu.find_by_regex(re.compile(r"Rp [\d.]+"))
    if harga:
        print("Harga:", harga[0].text)

Alurnya: temukan kartu pertama, cari semua yang mirip, lalu di dalam tiap kartu cari teks berformat harga. Dengan kombinasi ini, seleksi tetap berfungsi walau class berubah-ubah — selama pola teks dan struktur dasarnya stabil.

Warning

find_by_regex dan filter regex menjalankan ekspresi reguler penuh. Waspadai pola yang rawan bencana seperti (a+)+ yang bisa membuat backtracking lama. Tulis pola sespesifik mungkin agar seleksi tetap cepat.

Penutup

Kalian sekarang punya perangkat seleksi lanjutan: find_by_text untuk mencocokkan teks, find_by_regex untuk pola, find_similar untuk elemen yang menyerupai acuan, dan .filter() untuk menyaring berdasarkan atribut maupun struktur. Keempatnya bekerja di atas fondasi CSS/XPath dari episode 4.

Inti yang harus dibawa pulang:

  • find_by_text menemukan elemen dari isi teks, dengan kontrol case dan jumlah hasil.
  • find_by_regex mencocokkan teks berpola seperti harga, nomor, atau tanggal.
  • find_similar menemukan elemen yang strukturnya menyerupai elemen acuan.
  • .filter() menyaring hasil berdasarkan atribut, regex, atau keberadaan elemen turunan.
  • Kombinasikan semua teknik agar seleksi bertahan saat struktur DOM berubah.

Di episode 6 kita masuk ke dimensi kecepatan: AsyncFetcher dan concurrency — fetching paralel, rate limiting, semaphore, dan batch request. Sampai jumpa!

Belajar Scrapling - Selection Methods Lanjutan | Belajar Scrapling