goose3 Etiketlenmiş Boilerplate Döndürmedi. İki Kez de Hiçbir Şey Döndürmedi.

Son güncelleme: August 17, 2026
goose3 Etiketlenmiş Boilerplate Döndürmedi. İki Kez de Hiçbir Şey Döndürmedi.
AI Özeti
Sızıntının tanımlanabildiği fixture’larda goose3, 1.0000 içerik-belirteci kesinliği ve sıfır kirletici belirteç döndürdü. Çıktısına tek bir nav, reklam, yan panel, yorum ya da promosyon sözcüğü bile karışmadı. Altı kütüphanelik karşılaştırmada buna yaklaşan başka bir sonuç yoktu. Ama aynı zamanda set içindeki en düşük makale geri çağırma oranına da sahip — tüm 22 fixture genelinde 0.8243; Mozilla Readability’de bu değer 1.0000 — çünkü bunların ikisinde boş dize döndürdü. Bu metrikler skorlama kuralı gereği birbirine bağlıdır: boş sonuç koşullu kesinliğe katkı yapmaz, geri çağırma ise kaçırılan vakayı kayda geçirir.

Sızıntının tanımlanabildiği fixture’larda goose3 1.0000 içerik-belirteci kesinliği ve sıfır kirletici belirteç üretti. Çıktısına tek bir nav, reklam, yan panel, yorum ya da promosyon sözcüğü bile karışmadı. Altı kütüphanelik karşılaştırmada buna yaklaşan başka bir sonuç yoktu.

Ama aynı zamanda set içindeki en düşük makale geri çağırma oranına da sahip — tüm 22 fixture genelinde 0.8243; Mozilla Readability’de bu değer 1.0000 — çünkü bunların ikisinde boş dize döndürdü.

Bu metrikler skorlama kuralı gereği birbirine bağlıdır: boş sonuç koşullu kesinliğe katkı yapmaz, geri çağırma ise kaçırılan vakayı kayda geçirir.

goose3 nedir?

goose3, Gravity Labs’in Scala ile yazılmış Goose projesinden başlayıp python-goose üzerinden devam eden bir çizginin Python 3 sürümüdür. O, bir meta verili makale çıkarıcıdır, düz metin boşaltma aracı değil: bir Goose nesnesi oluşturur, extract() çağırırsınız ve yaklaşık yirmi sekiz erişilebilir alanı olan bir Article nesnesi geri alırsınız — temizlenmiş metin, başlık, yazarlar, yayın tarihi, öne çıkan görsel, meta açıklama, etiketler, bağlantılar, tweet’ler ve daha fazlası.

Resmî referans: goose3’ün resmî deposu.

Sistem diyagramı: HTML’den Article Alanlarına

Test edilen sürüm: 3.1.22, Apache lisanslı, 912 GitHub yıldızı, son push 2026-07-23 — test sırasında aktif olarak bakımı yapılıyordu. Python 3.14.2.

API iki çağrı ve bir zorunluluktan oluşuyor:

from goose3 import Goose
g = Goose()
try:
    article = g.extract(raw_html=html)
    text = article.cleaned_text
finally:
    g.close()          # kullanımdan sonra açıkça kapatın

Bu close() özellikle önemli; çünkü unutması çok kolay ve sizi uyaran hiçbir şey yok. Bu inceleme, kapatma atlandığında açık oturum, bağlantı ya da bellek tutulumu olup olmadığını sayısallaştırmak için bir döngü testi çalıştırmadı; dolayısıyla “kaynak sızıntısı” demek mevcut kanıttan daha güçlü olur. Burada, API kullanımının gösterdiği yaşam döngüsü gereksinimi olarak açık kapatmayı değerlendirin.

Dengeli karar, ölçülmüş hâliyle

Altı çıkarıcı, etiketlenmiş tek bir fixture seti, tek bir skorlayıcı. Her fixture’ın her bloğu article ya da boilerplate olarak etiketli ve benzersiz bir sentinel belirteci taşıyor; bu yüzden "bu birimi geri aldı mı?" sorusu benzerlik skoru değil, tam alt dize üyeliği olarak ölçülüyor.

KütüphaneMakale geri çağırma (22’nin tamamı)Boilerplate sızıntısıİçerik-belirteci kesinliğiKirletici belirteçlerÜretilen çıktı
Readability1.00000.23530.91093522/22
trafilatura0.98650.05880.9411422/22
newspaper4k0.98650.00000.9452022/22
resiliparse0.90540.05880.9381722/22
jusText0.83780.47060.87607419/22
goose30.82430.00001.0000020/22

sixway-scores.json. Geri çağırma tüm 22 fixture üzerinden; sızıntı oranı ve kesinlik ise hem makale hem boilerplate birimi içeren 11 fixture üzerinden hesaplanır.

Kesinlik sütununu her zaman son sütunla birlikte okuyun. Burada kesinlik, çıktı üretmeye şartlıdır — bir fixture’da boş dize döndüren kütüphane ne paya ne paydaya katkıda bulunur, dolayısıyla bu ortalamada geri çekilmek ücretsizdir. Pay, çıkarılan stopword olmayan belirteçler ile etiketlenmiş makale belirteçleri arasındaki çoklu küme kesişimidir; payda ise çıkarılan stopword olmayan tüm belirteçlerdir. “Kirletici belirteçler” daha dar bir ölçüdür: yalnızca etiketlenmiş boilerplate belirteçleriyle örtüşmeyi sayar. Makale çoklu kümesini eşleştirmeyen ekstra bir çıkarılmış belirteç, bu kirletici sayısını artırmadan kesinliği düşürür; makale çoklu kümesini aşan tekrarlı belirteçler de aynı etkiyi yaratabilir. newspaper4k’nin 0 kirletici belirteçle 1.0000 altında kalabilmesinin nedeni budur. goose3’ün 1.0000 değeri 11 fixture’ın 10’unda skorlandı; Readability, trafilatura, newspaper4k ve resiliparse ise 11/11 üzerinden puanlandı.

Bu sentetik set içinde 1.0000 yine de anlamlı. Skorlanan on fixture boyunca goose3 etiketli boilerplate belirteçlerinden hiçbirini üretmedi; Readability aynı sayfalarda 35 tane üretti. Eğer bir model bu çıktıyı tüketiyorsa, bu on fixture’da boilerplate etiketleri için sıfır token harcaması demektir. Bu, gerçek sayfalarda sıfır israf olduğunu göstermez; ayrıca boş sonuç, hattın başka bir yerinde fallback veya tekrar maliyeti doğurabilir.

İki sessizlik ve anlamları

goose3 tam olarak iki fixture’da hiçbir şey döndürmedi. Bunlardan biri savunulabilir, biri ise gerçek bir sınırlama.

Neredeyse boş belge. Tek bir 32 karakterlik makale birimi olan bir sayfa. goose3 vazgeçiyor. jusText de öyle. Bu fixture setinde Readability tüm 22 sayfada çıktı üretti; dolayısıyla onun sonucu burada goose3’ün sessizliğini desteklemiyor. Bu kadar küçük bir belgeyi reddetmenin kabul edilebilir olup olmadığı, çağıranın minimum içerik sözleşmesine bağlıdır.

Sistem diyagramı: Boş Çıktıyı Başarısızlık Olarak Ele Al

Tamamı <li> öğelerinden oluşan makale. Altı makale birimi var; hiçbiri <p> etiketinde değil. goose3 boş dize döndürüyor.

Bu ikinci durum beni şaşırttı; çünkü goose3’ün kendi varsayılan yapılandırmasında parse_lists=True yazıyor. Bu yüzden test ettim — bir kütüphane hakkında sonuç çıkarmak için tek başarısız koşum yetmez diye, çalışan bir kontrolle birlikte üç yapılandırma:

YapılandırmaYalnızca liste içeren sayfa<p> kontrolü
varsayılanlar0 karakter937 karakter
strict=False0 karakter937 karakter
parse_lists=True (açıkça)0 karakter937 karakter

list-only-probe.json.

Üçünde de sıfır, kontrol üçünde de 937 karakter döndürüyor. Yani parse_lists=True, listelerin goose3’ün zaten bulduğu bir makalenin içinde korunup korunmayacağını belirliyor — bir listeyi adayın bizzat makale olarak seçmesini sağlamıyor. goose3’ün düğüm puanlaması gövdeyi bulabilmek için paragraf biçimli bloklara ihtiyaç duyuyor; gövdesi liste olan bir sayfada böyle bir blok yok.

Desteklenen sonuç daha dar: bu sentetik fixture’daki gibi şekillenen bir gövde — altı makale birimi, hepsi <li>, paragraf adayı yok — boş dize döndürdü. Gerçek sayfa tekrarında changelog’lar, API referansları, tarifler, SSS sayfaları ve karşılaştırma yazıları, liste ağırlıklı olabilecekleri için makul risk örnekleridir; ancak bu tek fixture, bu sayfa kategorilerinin genel olarak başarısız olduğunu kanıtlamaz.

Boş dize, ancak çağıran boş olmayan çıktıyı doğrularsa makine tarafından fark edilir. Makalenin hiç olmadığı, ama yine de makale varmış gibi görünen metinden daha kolay denetlenir; yine de yalnızca exception takibine dayalı izlemede sessiz bir başarısızlıktır. Üretimdeki bir çağıranın minimum çıktı kontrolü ve bir fallback ya da açıkça başarısız sayfa kaydı olması gerekir.

Kurulum gerçeği

pip install goose3 yaklaşık 6 ila 9 saniyede 16 paket ve 44.3 MiB indirir. Temiz bir alt işlemde ölçülen soğuk import: 2.181 s.

Resmî referans: goose3 on PyPI.

KütüphanePaketlersite-packagesSoğuk importÇıkarma p50
resiliparse521.0 MiB0.015 s0.06 ms
jusText322.4 MiB0.777 s0.56 ms
goose31644.3 MiB2.181 s1.85 ms
newspaper4k2247.5 MiB2.812 s2.69 ms
trafilatura1769.9 MiB1.584 s0.51 ms

install-and-import.json. Her kütüphane kendi boş sanal ortamında; dolayısıyla yanındaki başka bir projeden miras footprint yok.

Ağırlıkta ortalarda, hızda ortalarda. Python 3.14.2 üzerinde temiz kuruldu ve import edildi; bu kategoride bu her zaman geçerli değil.

Dağıtıma çıkmadan önce bilinmesi gereken üç varsayılan

Sistem diyagramı: Dağıtıma çıkmadan önce bilinmesi gereken üç varsayılan

Dokümantasyon yerine birlikte gelen Configuration nesnesini okumak, on dokuz ayar ortaya çıkarıyor. Üçü birilerini şaşırtabilir.

Kendisini ilan ediyor. browser_user_agent varsayılan olarak Goose/3.1.22. Eğer goose3 kendi çekimini yaparsa, dokunduğunuz her sunucu kütüphane adını ve tam sürümünü kayda geçirir. Dürüsttür; ama aynı zamanda bir parmak izidir. Bilinçli olarak ayarlayın ya da HTML’yi kendiniz çekip raw_html olarak verin.

MacPorts ikili yolunu işaret ediyor. imagemagick_convert_path varsayılanı /opt/local/bin/convert, imagemagick_identify_path ise /opt/local/bin/identify. Benim makinemde ikisi de yok — /opt/local, çoğu kişinin sahip olmadığı MacPorts’tur; Homebrew ise ikilileri /opt/homebrew altında koyar. Varsayılan, görüntü çekimini açmadığınız sürece etkisizdir (enable_image_fetching zaten akıllıca biçimde False), ama öne çıkan görsel çıkarımının çalışmasını bekleyerek bunu açarsanız, işte o zaman sessizce çalışmayacaktır.

İngilizce varsayıyor. target_language varsayılanı use_meta_language=True ile birlikte en; yani sayfa kendi dilini bildiriyorsa onu takip eder, bildirmiyorsa İngilizceye döner. İngilizce işler için sorun yok; diğer dillerde açıkça ayarlamak gerekir.

Geri kalanlar makul: parser_class lxml, http_timeout 30 saniye, strict açık, log_level ERROR, parse_headers ve keep_footnotes açık, images_min_bytes 4,000.

Bellek ve bozuk HTML’nin etkisi

Bu serideki her incelemenin “test edilmedi” diye bıraktığı iki konu artık ölçüldü.

Daha geniş stres testi bağlamı on kütüphanelik bellek ve bozuk HTML karşılaştırmasında yer alıyor.

Tepe çalışan bellek, /usr/bin/time -l ile; her hücre için yeni bir süreç — import tabanı, kütüphanenin yüklenmiş ve beklemede maliyetidir; tepeler ise belgeyi içerir.

KütüphaneÇalışma zamanıImport tabanı226 KB tepe10 MB tepe
html2textpython3.1418.719.971.2
pyquerypython3.1430.333.9172.5
resiliparsepython3.1420.525.1225.1
markdownifypython3.1423.928.9278.5
goose3python3.1444.152.4398.5
cheerionode2266.876.5398.5
justextpython3.1430.336.6431.2
newspaper4kpython3.1452.661.8668.5
trafilaturapython3.1452.564.8927.1
turndownnode2247.868.42947.1

memory-results.json. Python ve Node tabanları birbirleriyle karşılaştırılabilir değildir; her ikisinin içinde de yorumlayıcı vardır.

goose3’ün tabanı 44.1 MiB ve 10 MB’lık bir belgede 398.5 MiB’ye çıkıyor. Import tabanı, gösterilen Python kütüphaneleri arasında üçüncü en yüksek değer; soğuk başlangıca duyarlı dağıtımlarda bilmek gerekir.

Bozuk HTML. Her biri tam bir şeyi bozan on iki belge — kapanmamış etiketler, yanlış iç içe geçmiş satır içi öğeler, içinde boşluk olan tırnaksız öznitelikler, sarkık kapatıcılar, hiç <html> olmaması, yinelenen öznitelikler, etiket ortasında kesilmiş belge, hatalı entity’ler, kapanmamış bir <script>, gerçeğe aykırı bir charset bildirimi, markup içeren yorum ve 600 seviyelik iç içe geçme — artı eşleşen boyutlarda iki düzgün kontrol, çünkü “hiçbir şey döndürmedi” ifadesi, aynı boyuttaki temiz bir belgede de sessiz kalan bir kütüphane için bozukluk hakkında bir şey söylemez.

goose3 14’ün 0’ında hata fırlattı ve 10’unda hiçbir şey döndürmedi; bozuk fixture’lar boyunca 33 sentinel’in 2/33’ünü kurtardı (malformed-results.json). Bu sayımdan bir fixture hariçtir: HTML5’e göre kapanmamış bir <script> sonrasında gelen her şey script içeriğidir; dolayısıyla orada onu kaybetmek doğrudur, onu geri almak ise sapmadır.

Artılar ve eksiler

Lehine. Çıktı ürettiği on içerik-doğruluğu fixture’ında sıfır etiketli boilerplate belirteci. Yaklaşık yirmi sekiz makale alanı kullanılabilir, fakat bunların doğruluğu puanlanmaktan çok envanterlendi. Görüntü çekme için makul varsayılan (kapalı). Python 3.14’te temiz kurulum. Aktif bakımda. Apache-2.0. Çağıran açıkça kontrol ederse boş sonuç kolayca engellenebilir.

Aleyhine. Set içindeki en düşük makale geri çağırma oranı 0.8243; bu, yanlış bir şey döndürmekten değil, doğrudan hiçbir şey döndürmemekten kaynaklanıyor. Makalesi listeden oluşan sayfa, yapılandırmadan bağımsız olarak boş dize üretir. 44.3 MiB ve 2.2 saniyelik soğuk import, resiliparse’ın 21.0 MiB ve 15 ms değerlerine göre ağırdır. close() ister. İki varsayılan ayar, çoğu makinede yanlış olan şeyleri işaret ediyor.

Kim kullanmalı, kim kullanmamalı?

goose3’ü kullanın eğer çıkarılan metin bir model ya da veritabanına gidecekse ve etiketli boilerplate maliyeti yüksekse, ayrıca sayfalar paragraf yapısında klasik makalelerse. Bu fixture setinde cevap verdiğinde etiketli boilerplate belirteci üretmedi. Meta veri yüzeyi mevcut; ancak burada doğrulanmadı — başlık, yazar, tarih ve görsel doğruluğu, seçim avantajına dönüşmeden önce ayrı ground-truth fixture’larla ölçülmeli.

Kullanmayın eğer korpusunuz liste ağırlıklıysa — boş dizeler alırsınız ve nedenini öğrenemezsiniz. Soğuk başlatma maliyeti önemliyse de kullanmayın; çünkü resiliparse 145 kat daha hızlı import oluyor. Ve her sayfada bir yanıt istiyorsanız yine kullanmayın; çünkü burada “yanıt yok” gerçek bir sonuç: 22 fixture’ın ikisinde ve ikisi de sessiz şekilde, yani boş dizenin exception olmaması anlamında.

Test etmeye değer bir eşleşme: goose3’ü birincil, cleaned_text boşsa ya da minimum içerik kuralınızın altındaysa fallback ile kullanın. Readability, goose3’ün iki boş vakası dahil bu 22 fixture’ın tamamında tüm makale birimlerini geri getirdi. Bu sentetik sonuç mimari örüntüyü destekler; gerçek sayfalarda fallback’in asla kaçırmayacağına dair vaat değildir.

Yönetilen API nerede devreye girer?

Bu benchmark, goose3’ün raw_html çıkarım yolunu test etti: HTML, goose3 onu görmeden önce zaten alınmıştı. goose3’ün kendi ağdan çekme yolu da var; User-Agent ayarı bunu gösteriyor, ama o yol burada test edilmedi. JavaScript render’ı ve anti-bot davranışı da test edilmedi.

Aynı fixture’lar için altı çıkarıcının tamamını karşılaştırmak isterseniz, altı kütüphaneli çıkarım karşılaştırmasına bakın.

Bizim Thunderbit dâhil, yönetilen bir alma/render/çıkarma hizmeti farklı bir sorumluluk sınırını kapsar. Thunderbit bu testte benchmark edilmedi. Buradaki ayrım, sağlanan HTML’den makale çıkarımı ile URL’yi alıp işleyen barındırılmış servis arasındadır; bu makale aynı metriklerde bir performans ya da kalite karşılaştırması sunmuyor.

Adil karşılaştırma şu: goose3’ün alan seti sabit ve makale biçimli; sayfalarınız makaleyse tam doğru, ürün listeleriyse yanlış. HTML zaten elinizdeyse ve sayfalarınız makaleyse goose3 ücretsiz ve oldukça temizdir.

Barındırılan seçenek için web scraping API derlememiz daha geniş resmi verir; self-hosted alternatifler için açık kaynak scraper ana yazısı. Metin bir modele gidecekse, Python’da HTML’yi Markdown’a dönüştürme doğruluğun tam olarak nerede kaybolduğunu anlatır.

Web Veri Çıkarımı için Thunderbit’i Deneyin

goose3 kullanmalı mısınız?

Evet, eğer iş yükü paragraf biçimli makalelere uyuyorsa ve çağıran boş çıktıyı başarı değil başarısız çıkarım olarak ele alıyorsa.

Bu fixture setinde goose3 cevap verdiğinde etiketli boilerplate belirteci üretmedi ve iki boş dize döndürdü. Biri neredeyse boş sayfaydı, diğeri yalnızca liste içeren sentetik gövdedeydi. Bu, kesinlik/kapsam takasıdır; ürün genelinde bir mizacın kanıtı değil.

Geri çağırma daha önemliyse, açık bir minimum çıktı koruması olan bir fallback’i test edin. Readability bu 22 fixture’da tüm makale birimlerini kurtardı; newspaper4k ise tüm 22 sayfada çıktı üretirken sıfır etiketli boilerplate-birim sızıntısı ve 0.9865 geri çağırma gösterdi. Bu sonuçlar, sentetik seti varsayılanlarda sıralar; bilinmeyen üretim iş yüklerinde değil.

goose3, yanlış bir kelimenin maliyetinin eksik bir sayfanın maliyetinden daha yüksek olduğu durumlarda yerini hak eder.

Web Veri Çıkarımı için Thunderbit’i Deneyin Get Started Free

SSS

goose3’ün kusursuz kesinliği gerçek mi, yoksa bazı sayfalarda sonuç vermemesinin yan ürünü mü? İkisi de; ayrıca birbirinden ayrıştırılabilir. Boilerplate içeren 11 fixture’ın 10’unda skorlandı, yani ortalamadan bir fixture eksik — bu kısım sonuç vermemesinin yan ürünü. Ama o on fixture’da, özellikle adversarial olarak tasarlanmış boilerplate karşısında sıfır kirletici belirteç döndürdü; Readability ise 35 sızıntı yaptı. Kesinlik, cevap verdiği sayfalarda gerçektir; sonuç vermemesi ise geri çağırma sütununda görünür.

goose3 neden makalesi liste olan bir sayfada hiçbir şey döndürmüyor? Aday puanlaması, makale gövdesini bulmak için paragraf biçimli bloklara ihtiyaç duyuyor; <li> öğelerinden oluşan bir sayfada böyle bloklar yok. parse_lists=True varsayılanı bunu değiştirmiyor — açıkça denedim, strict=False ile birlikte, ve üç yapılandırmanın hepsinde sıfır karakter aldım; buna karşılık <p> tabanlı kontrol üçünde de 937 karakter döndürdü. parse_lists, zaten bulunmuş bir makalenin içinde listelerin korunup korunmayacağına karar verir.

close() çağırmak zorunda mıyım? Yukarıda gösterildiği gibi try/finally ile açıkça kapatın. Bu inceleme, kapatma atlandığında ne biriktiğini ölçmedi; dolayısıyla nicelenmiş bir döngü sızıntısı iddiasında bulunmuyor. Ama Goose’un çağıranın yönetmesi gereken bir yaşam döngüsü olduğunu ortaya koyuyor.

goose3 User-Agent olarak ne gönderiyor? Varsayılan olarak Goose/3.1.22 — yani kütüphane adı ve tam sürüm. Bu yalnızca onun çekim yapmasına izin verdiğinizde geçerli; raw_html vermek bunu tamamen devre dışı bırakır. Çekmesine izin verirseniz User-Agent’ı bilinçli seçin; varsayılan, dokunduğunuz her sunucuya tam olarak neyin çağrı yaptığını söyler.

Bu inceleme neyi test etmedi? Gerçek dünya sayfalarını hiç — bunların hepsi kontrollü fixture’lar. target_language birinci sınıf bir ayar olmasına rağmen çok dilli çıkarım test edilmedi. Başlık, yazarlar, tarih, üst görsel gibi meta veri alanları envanterlendi ama doğruluk için puanlanmadı. Görüntü çekimi varsayılan olarak kapalı ve ImageMagick yolları çoğu makinede olmayan bir paket yöneticisini işaret ediyor. Eşzamanlı ya da uzun süreli yük altında bellek davranışı ve yük altındaki throughput da test edilmedi; bellek tablosu, bir yeni sürecin tek bir belgeyi işlemesini ölçtü.

Ke
Ke
Thunderbit’ta CTO | Kıdemli Veri Bilimci ve ML Uzmanı Makine öğrenimi ve veri bilimi alanında yaklaşık on yıllık deneyime sahip olan Ke Shen, Columbia University mezunu ve Walmart Labs’te eski Kıdemli Veri Bilimci’dir. Python, R, Java ve İstatistik konularında derin ve meslektaşları tarafından tanınan uzmanlığıyla, karmaşık yapay zekâ algoritmalarını teoriden üretim düzeyinde mimariye taşıma konusunda sahada test edilmiş içgörüler paylaşır.
İçindekiler
Thunderbit · AI web veri ajanı

Herhangi bir sayfadan 1 tık içinde veri çıkar

250.000+ kullanıcı tarafından güveniliyor
ücretsiz plan mevcut
Web sayfasından tabloya
İhtiyacını anlat — Thunderbit’in AI Ajanı bunu çeker ve Excel, Google Sheets, Airtable veya Notion’a aktarır. Başlamak ücretsiz.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week