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.

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.
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.
find_by_text menemukan elemen berdasarkan isi teksnya. Metode ini tersedia di Adaptor dan bisa dipanggil langsung pada tree atau hasil seleksi:
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:
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.
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:
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")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:
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.
Metode .filter() menyaring hasil seleksi berdasarkan kondisi atribut. Kalian bisa menyaring dari hasil seleksi yang sudah ada:
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 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:
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.
Semua metode di atas bukan silo; mereka paling bertenaga saat digabung. Contoh nyata: mencari semua harga diskon di dalam elemen yang mirip:
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.
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.Di episode 6 kita masuk ke dimensi kecepatan: AsyncFetcher dan concurrency — fetching paralel, rate limiting, semaphore, dan batch request. Sampai jumpa!