Ve všech testovacích sadách, kde vůbec šlo definovat únik obsahu, dosáhl goose3 1,0000 přesnosti content-tokenů a nula rušivých tokenů. Do výstupu se nedostal ani jediný výraz z navigace, reklam, postranních panelů, komentářů ani promo bloků. Nic jiného v porovnání šesti knihoven tohle nedokázalo zopakovat.
Zároveň ale měl v celém souboru nejhorší recall článku — 0,8243 napříč všemi 22 testovacími sadami, oproti 1,0000 u Mozilla Readability — protože ve dvou případech vrátil prázdný řetězec.
Tyto metriky spolu souvisejí přes způsob hodnocení: prázdný výsledek nepřispívá do podmíněné přesnosti ničím, zatímco recall zaznamená zmeškaný případ.
Co je goose3
goose3 je pokračováním Python 3 větve, která navazuje na Goose od Gravity Labs v jazyce Scala a přes python-goose. Jde o extraktor článků s metadaty, ne o pouhý výpis textu: vytvoříte Goose, zavoláte extract() a dostanete objekt Article s přibližně osmadvaceti dostupnými poli — vyčištěný text, název, autory, datum publikace, hlavní obrázek, meta description, tagy, odkazy, tweety a další.
Oficiální reference: oficiální repozitář goose3.

Testovaná verze: 3.1.22, s licencí Apache, 912 hvězdiček na GitHubu, naposledy pushnuto 2026-07-23 — v době testu aktivně udržováno. Python 3.14.2.
Rozhraní API jsou dva kroky a jedna povinnost:
from goose3 import Goose
g = Goose()
try:
article = g.extract(raw_html=html)
text = article.cleaned_text
finally:
g.close() # po použití explicitně zavřít
close() stojí za zmínku, protože se na něj snadno zapomíná a nic vás neupozorní. Tahle recenze nespouštěla smyčku testů, aby kvantifikovala ponechané relace, spojení nebo paměť při vynechání zavření, takže označit to jako „resource leak“ by bylo silnější tvrzení, než dovolují data. Explicitní zavření berte jako životní cyklus, který ukazuje způsob použití API.
Měřený kompromis
Šest extraktorů, jedna anotovaná sada testů, jeden hodnoticí mechanismus. Každý blok každé testovací stránky je označen jako article nebo boilerplate a nese unikátní sentinel token, takže otázka „zachytil tohle konkrétní jednotku?“ je přesná kontrola podřetězce, ne jen podobnostní skóre.
| Knihovna | Recall článku (všech 22) | Únik boilerplate | Přesnost content-tokenů | Rušivé tokeny | Vygenerovaný výstup |
|---|---|---|---|---|---|
| Readability | 1.0000 | 0.2353 | 0.9109 | 35 | 22/22 |
| trafilatura | 0.9865 | 0.0588 | 0.9411 | 4 | 22/22 |
| newspaper4k | 0.9865 | 0.0000 | 0.9452 | 0 | 22/22 |
| resiliparse | 0.9054 | 0.0588 | 0.9381 | 7 | 22/22 |
| jusText | 0.8378 | 0.4706 | 0.8760 | 74 | 19/22 |
| goose3 | 0.8243 | 0.0000 | 1.0000 | 0 | 20/22 |
sixway-scores.json. Recall je počítán přes všech 22 testovacích sad; míra úniku a přesnost přes 11 sad, které obsahují jak článkové, tak boilerplate jednotky.
Sloupec přesnosti čtěte vždy spolu s posledním sloupcem. Přesnost je zde podmíněná tím, že knihovna vůbec něco vrátí — knihovna, která na nějaké sadě vrátí prázdný řetězec, nepřidá nic ani do čitatele, ani do jmenovatele, takže nic nevrátit je v tomto průměru „zadarmo“. Čitatel je průnik mezi extrahovanými tokeny bez stop slov a označenými tokeny článku; jmenovatel jsou všechny extrahované tokeny bez stop slov. „Rušivé tokeny“ znamenají užší měřítko: překryv pouze s označenými boilerplate tokeny. Dodatečný extrahovaný token, který neodpovídá ani článku, ani boilerplate, sníží přesnost, aniž by zvýšil tento počet rušivých tokenů; totéž mohou způsobit i opakované tokeny nad množinu článku. Proto může newspaper4k mít 0 rušivých tokenů a přitom přesnost pod 1,0000. goose3 dosáhl 1,0000 na 10 z 11 testovacích sad; Readability, trafilatura, newspaper4k a resiliparse byly hodnoceny na 11 z 11.
Ta hodnota 1,0000 má i tak ve vnitřním rámci této syntetické sady smysl. Ve všech deseti hodnocených sadách goose3 nevypustil ani jeden označený boilerplate token; Readability na stejných stránkách vypustil 35. Pokud výstup zpracovává model, znamená to, že v těchto deseti sadách se nespálil žádný token na boilerplate štítky. Neznamená to však nulový odpad na reálných stránkách a prázdný výsledek může jinde v pipeline znamenat fallback nebo dodatečný retry náklad.
Ticho ve dvou případech a co znamená
goose3 nevrátil nic přesně ve dvou testovacích sadách. Jeden případ je obhajitelný, druhý je skutečný limit.
Téměř prázdný dokument. Stránka s jednou článkovou jednotkou o 32 znacích. goose3 ji odmítne. Stejně tak jusText. V této sadě testů vrátil Readability výstup na všech 22 stránkách, takže jeho výsledek goose3ovo ticho v tomto případě nepodporuje. Jestli je odmítnutí takto drobného dokumentu přijatelné, záleží na tom, jaké máte minimum obsahu v kontraktu volajícího.

Článek složený výhradně z prvků <li>. Šest článkových jednotek, žádná z nich v tagu <p>. goose3 vrátí prázdný řetězec.
To druhé mě zaskočilo, protože výchozí konfigurace goose3 sama uvádí parse_lists=True. Proto jsem to prověřil — tři konfigurace proti fungujícímu kontrolnímu případu, protože jeden neúspěšný běh ještě není závěr o knihovně:
| Konfigurace | Stránka jen se seznamy | <p> kontrola |
|---|---|---|
| výchozí nastavení | 0 znaků | 937 znaků |
strict=False | 0 znaků | 937 znaků |
parse_lists=True (explicitně) | 0 znaků | 937 znaků |
Všechny tři případy vrací nulu, zatímco kontrola vrací ve všech třech 937 znaků. parse_lists=True tedy rozhoduje o tom, zda se seznamy zachovají uvnitř článku, který goose3 už našel — neumožňuje, aby hodnotitel kandidátů chápal seznam samotný jako článek. Bodování uzlů v goose3 potřebuje bloky ve tvaru odstavců, aby vůbec našlo tělo textu, a stránka, jejíž tělo je seznam, takové bloky nemá.
Podporovaný závěr je užší: tělo v podobě této syntetické sady — šest článkových jednotek, všechny v <li>, bez kandidáta odstavce — vrátilo prázdný řetězec. Changelogy, API reference, recepty, FAQ stránky a srovnávací články jsou rozumné rizikové vzorky pro přehrání na reálných stránkách, protože mohou být hodně seznamové, ale tahle jediná sada nedokazuje, že tyto kategorie obecně selhávají.
Prázdný řetězec jde strojově rozpoznat jen tehdy, když volající ověřuje, že výstup není prázdný. Je snazší ho odchytit než text, který vypadá plausibilně, ale neobsahuje nic z článku. Stále ale jde o tiché selhání v monitoringu založeném jen na výjimkách. Produkční volající potřebuje kontrolu minimálního výstupu a fallback nebo explicitní záznam o neúspěšné stránce.
Realita nasazení
pip install goose3 stáhne 16 balíčků a 44,3 MiB zhruba za 6 až 9 sekund. Studený import měřený v novém subprocessu: 2,181 s.
Oficiální reference: goose3 na PyPI.
| Knihovna | Balíčky | site-packages | Studený import | Extraction p50 |
|---|---|---|---|---|
| resiliparse | 5 | 21.0 MiB | 0.015 s | 0.06 ms |
| jusText | 3 | 22.4 MiB | 0.777 s | 0.56 ms |
| goose3 | 16 | 44.3 MiB | 2.181 s | 1.85 ms |
| newspaper4k | 22 | 47.5 MiB | 2.812 s | 2.69 ms |
| trafilatura | 17 | 69.9 MiB | 1.584 s | 0.51 ms |
install-and-import.json. Každá knihovna běžela ve vlastním prázdném virtuálním prostředí, takže nezdědila žádnou zátěž po jiné.
V hmotnosti je uprostřed pole, ve rychlosti také. Na Pythonu 3.14.2 se nainstaloval a importoval bez problémů, což v této kategorii není samozřejmost.
Tři defaulty, které stojí za to znát před nasazením

Když se místo dokumentace podíváte na dodaný objekt Configuration, najdete devatenáct nastavení. Tři z nich někoho překvapí.
Představuje se samo. browser_user_agent má výchozí hodnotu Goose/3.1.22. Pokud necháte goose3 samotné stahovat HTML, každý server, kterého se dotknete, si zaloguje název knihovny i její přesnou verzi. Je to poctivé, ale zároveň je to otisk. Nastavte to záměrně, nebo si HTML stáhněte sami a předejte raw_html.
Ukazuje na binárku z MacPorts. imagemagick_convert_path má výchozí hodnotu /opt/local/bin/convert a imagemagick_identify_path /opt/local/bin/identify. Na mém stroji ani jedna neexistuje — /opt/local je MacPorts, které většina lidí nemá; Homebrew dává binárky do /opt/homebrew. Výchozí hodnota je neaktivní, dokud nezapnete stahování obrázků (enable_image_fetching je výchozí False, což je rozumné), ale pokud to zapnete a čekáte, že se extrakce hlavního obrázku rozjede, tady to tiše selže.
Předpokládá angličtinu. target_language má výchozí hodnotu en a use_meta_language=True, takže pokud stránka deklaruje vlastní jazyk, řídí se jím, a jinak spadne zpět na angličtinu. Pro anglický obsah v pořádku, pro cokoli jiného je lepší nastavit to explicitně.
Ostatní hodnoty jsou rozumné: parser_class je lxml, http_timeout 30 sekund, strict zapnuto, log_level ERROR, parse_headers a keep_footnotes zapnuto, images_min_bytes 4 000.
Paměť a co s ní dělá rozbitý HTML
Dvě věci, které každá recenze v této sadě označila jako netestované, jsou teď změřené.
Širší kontext zátěžového testu je v porovnání paměti a rozbitého HTML u deseti knihoven.
Špičková residentní paměť, přes /usr/bin/time -l, jeden nový proces na buňku — spodní hranice importu je cena knihovny načtené a nečinné, špičky už zahrnují dokument.
| Knihovna | Runtime | Import floor | 226 KB peak | 10 MB peak |
|---|---|---|---|---|
| html2text | python3.14 | 18.7 | 19.9 | 71.2 |
| pyquery | python3.14 | 30.3 | 33.9 | 172.5 |
| resiliparse | python3.14 | 20.5 | 25.1 | 225.1 |
| markdownify | python3.14 | 23.9 | 28.9 | 278.5 |
| goose3 | python3.14 | 44.1 | 52.4 | 398.5 |
| cheerio | node22 | 66.8 | 76.5 | 398.5 |
| justext | python3.14 | 30.3 | 36.6 | 431.2 |
| newspaper4k | python3.14 | 52.6 | 61.8 | 668.5 |
| trafilatura | python3.14 | 52.5 | 64.8 | 927.1 |
| turndown | node22 | 47.8 | 68.4 | 2947.1 |
memory-results.json. Základy pro Python a Node se mezi sebou přímo srovnávat nedají; interpret je v obou případech součástí ceny.
goose3 má základ 44,1 MiB a na dokumentu o 10 MB špičku 398,5 MiB. Jeho importní základ je třetí nejvyšší mezi zobrazenými Python knihovnami, což je dobré vědět pro nasazení citlivé na cold start.
Rozbité HTML. Dvanáct dokumentů, z nichž každý porušuje přesně jednu věc — neuzavřené tagy, špatně zanořené inline elementy, atributy bez uvozovek s mezerami, osamělé uzávěry, žádný <html> vůbec, duplicitní atributy, dokument useknutý uprostřed tagu, chybné entity, neuzavřený <script>, falešné deklarace charsetu, komentář obsahující značky a 600 úrovní zanoření — plus dva správně vytvořené kontrolní dokumenty stejné velikosti, protože „nevrátil nic“ něco o rozbitosti vypovídá jen tehdy, pokud knihovna mlčí i na čistém dokumentu stejné velikosti.
goose3 vyhodil výjimku ve 0 z 14 případů a nevrátil nic ve 10, přičemž obnovil 2/33 sentinelů přes rozbité testy (malformed-results.json). Jeden test je z tohoto počtu vyloučen: podle HTML5 je vše po neuzavřeném <script> skutečně obsah skriptu, takže jeho ztráta je správně a jeho obnovení by bylo odchylkou.
Klady a zápory
Ve prospěch. Nula označených boilerplate tokenů ve všech deseti testech fidelity obsahu, kde něco vrátil. K dispozici je přibližně osmadvacet polí článku, i když jejich přesnost byla pouze zmapována, ne bodována. Rozumný výchozí režim stahování obrázků (vypnuto). Čistá instalace na Python 3.14. Aktivně udržované. Apache-2.0. Prázdný výsledek se dá snadno odchytit, pokud ho volající explicitně kontroluje.
Proti. Nejnižší recall článku v sadě, 0,8243, způsobený čistě tím, že vrátí úplně nic, ne tím, že vrátí špatně. Stránka, jejíž článek je seznam, vrátí prázdný řetězec bez ohledu na konfiguraci. 44,3 MiB a studený import 2,2 s jsou proti resiliparse, které má 21,0 MiB a 15 ms, těžké. Vyžaduje close(). Dva defaulty míří na hodnoty, které jsou na většině strojů špatně.
Kdo by ho měl použít a kdo ne
Použijte goose3 jako kandidáta tam, kde extrahovaný text míří do modelu nebo databáze, kde je boilerplate drahý, a stránky jsou běžné články s odstavci. V této sadě testů, když odpověděl, nevypustil žádné označené boilerplate tokeny. Povrch metadat je k dispozici, ale tady nebyl validován; přesnost názvu, autora, data a obrázku potřebuje samostatné testovací sady s ground truth, než z toho bude výhoda pro výběr.
Vynechte ho, pokud je váš korpus hodně seznamový — dostanete prázdné řetězce a bez vysvětlení. Vynechte ho také, pokud záleží na cold-start nákladu, protože resiliparse se importuje 145× rychleji. A vynechte ho, pokud potřebujete odpověď na každé stránce, protože „žádná odpověď“ je tady reálný výsledek: na dvou z 22 testovacích sad, a obě mlčky, v tom smyslu, že prázdný řetězec není výjimka.
Párování, které stojí za otestování: goose3 jako primární řešení a fallback ve chvíli, kdy cleaned_text chybí nebo je pod vaším minimem obsahu. Readability v této sadě 22 testů obnovila každou článkovou jednotku, včetně obou prázdných případů goose3. Tento syntetický výsledek podporuje architektonický vzor, ne slib, že fallback na reálných stránkách nikdy nic nevynechá.
Kam zapadá řízené API
Tento benchmark testoval extrakční cestu goose3 přes raw_html: HTML už bylo stažené, než se k němu goose3 dostal. goose3 má také vlastní cestu pro síťové stahování, jak naznačuje nastavení User-Agent, ale ta tu testovaná nebyla. JavaScript rendering a anti-bot chování také testované nebyly.
Pro stejné testovací sady napříč všemi šesti extraktory se podívejte na srovnání šesti knihoven pro extrakci.
Řízená služba pro fetch/render/extraction, včetně naší Thunderbit, pokrývá jinou hranici odpovědnosti. Thunderbit v tomto testu nebyl benchmarkován. Podstatný rozdíl je mezi extrakcí článků z dodaného HTML a hostovanou službou, která URL sama získá a zpracuje; tento článek nenabízí srovnání výkonu ani kvality na stejných metrikách.
Spravedlivé srovnání: sada polí goose3 je pevná a článkově orientovaná, což je přesně správně pro článkové stránky a špatně pro produktové výpisy. Pokud už HTML máte a stránky jsou články, goose3 je zdarma a velmi čisté řešení.
Pro hostovanou variantu je náš přehled web scraping API širší pohled; pro self-hosted alternativy přehled open-source scraperů. Pokud text míří do modelu, převod HTML do Markdownu v Pythonu ukazuje, kde se ve skutečnosti ztrácí přesnost.
Vyzkoušet Thunderbit pro extrakci webových dat
Měli byste goose3 použít?
Ano, pokud se vaše pracovní zátěž skládá z článků s odstavci a volající bere prázdný výstup jako selhání extrakce, ne jako úspěch.
V této sadě testů goose3, když odpověděl, nevypustil žádné označené boilerplate tokeny a ve dvou případech vrátil prázdný řetězec. Jeden byl téměř prázdný web a druhý syntetické tělo tvořené jen seznamy. To je kompromis mezi přesností a pokrytím, ne důkaz celkového temperamentu produktu.
Pokud je důležitější recall, otestujte fallback s jasnou kontrolou minimálního výstupu. Readability obnovila každou článkovou jednotku v těchto 22 testech; newspaper4k vykázal nulový únik boilerplate jednotek a recall 0,9865, přičemž generoval výstup na všech 22 stránkách. Tyto výsledky jsou pořadím v této syntetické sadě, ne neznámou produkční zátěží.
goose3 si své místo zaslouží tam, kde je cena za špatné slovo vyšší než cena za chybějící stránku.
Vyzkoušet Thunderbit pro extrakci webových dat Get Started Free
Časté dotazy
Je perfektní přesnost goose3 skutečná, nebo je to důsledek toho, že občas nic nevrátí? Obojí, a ty dvě věci lze oddělit. Byl hodnocen na 10 z 11 testů, které obsahují boilerplate, takže jedna testovací sada z průměru chybí — to je část způsobená tím, že nic nevrátil. Ale v těch deseti vrátil nula rušivých tokenů proti záměrně nepřátelskému boilerplate, zatímco Readability uniklo 35. Přesnost je tedy skutečná pro stránky, na které odpoví; v recall sloupci se ukáže, že někdy mlčí.
Proč goose3 nic nevrátí na stránce, jejíž článek je seznam?
Jeho kandidátní skórování potřebuje bloky ve tvaru odstavců, aby našlo tělo článku, a stránka postavená z <li> takové bloky nemá. Výchozí parse_lists=True na tom nic nemění — zkusil jsem to explicitně, stejně jako strict=False, a ve všech třech konfiguracích vyšlo 0 znaků, zatímco kontrola založená na <p> vrátila ve všech třech 937 znaků. parse_lists rozhoduje o tom, zda se seznamy zachovají uvnitř článku, který už byl nalezen.
Musím volat close()?
Ano, zavřete ho explicitně přes try/finally, jak je ukázáno výše. Tahle recenze neměřila, co se hromadí, když se zavření vynechá, takže netvrdí žádný kvantifikovaný leak ve smyčce; ukazuje ale, že Goose má životní cyklus, který musí spravovat volající.
Jaký User-Agent goose3 posílá?
Ve výchozím nastavení Goose/3.1.22 — tedy název knihovny a přesnou verzi. To platí jen tehdy, když necháte goose3 stahovat samo, a při předání raw_html se tomu úplně vyhnete. Pokud mu stahování dovolíte, nastavte User-Agent záměrně; výchozí hodnota každému serveru, kterého se dotknete, přesně prozradí, kdo volá.
Co tahle recenze netestovala?
Reálné webové stránky vůbec — pracuje se s kontrolovanými testovacími sadami. Vícejazyčnou extrakci, ačkoliv target_language je plnohodnotné nastavení. Metadatová pole (název, autoři, datum, hlavní obrázek) byla zmapována, ale nehodnocena na přesnost. Stahování obrázků, které je ve výchozím stavu vypnuté a jehož cesty pro ImageMagick míří na správce balíčků, kterého většina strojů nemá. Současné nebo dlouhodobé paměťové chování ani throughput pod zátěží; tabulka paměti měřila jeden nový proces zpracovávající jeden dokument.


