newspaper4k 在 22/22 個受控文章樣本中的輸出表現

最後更新於 August 17, 2026
newspaper4k 在 22/22 個受控文章樣本中的輸出表現
AI 摘要
在一組經過標註、以文章為主的測試樣本中,newspaper4k 對全部 22 個樣本都成功產生輸出,找回了 98.65% 的評分文章單元,且沒有帶入任何標註樣板文字。就這三項指標來看,它非常符合本測試的優先目標;但這並不代表它是放諸四海皆準的最佳選擇。在這組樣本裡,沒有其他工具能同時達到這三個觀察結果。Mozilla Readability 找回了所有評分內容單元,但夾帶了更多標註樣板;goose3 雖然沒有混入標註樣板,卻有兩次回傳空字串。不同的判斷標準,仍可能會偏好其他函式庫。

在一組經過標註、以文章為主的測試樣本中,newspaper4k 對 全部 22 個樣本 都成功產生輸出,找回了 98.65% 的評分文章單元,且沒有帶入任何標註過的樣板文字。就這三項指標來看,它非常符合本測試的優先目標;但這並不代表它是放諸四海皆準的最佳選擇。

在這組樣本裡,沒有其他工具能同時達到這三個觀察結果。Mozilla Readability 找回了所有評分內容單元,但夾帶了更多標註樣板;goose3 雖然沒有混入標註樣板,卻有兩次回傳空字串。不同的判斷標準,仍可能會偏好其他函式庫。

有一個抓取預設值,在正式部署前特別值得注意。

newspaper4k 是什麼

newspaper4k 是 newspaper3k 的維護分支,而 newspaper3k 本身又是原始 newspaper 的 Python 3 延續版。這段血統很重要,因為你在網路上搜尋協助時,多半會看到前一代的資料,而它的部分 API 已經變動。

官方參考:newspaper4k 官方倉庫

System diagram: Article Extraction Pipeline

這個函式庫最容易用錯的一點之一,就是直接去呼叫 set_html()。這個方法根本不存在。HTML 需要透過 download() 載入:

from newspaper import Article
a = Article(url="https://example.com/story")
a.download(input_html=html)     # 不是 set_html()
a.parse()
text = a.text

我第一次執行時也犯了這個錯,還在確認是不是我自己的問題之前,先把函式庫評成 22 個樣本中只有 0 個正確。後來證實是我弄錯了。

它回傳的不只是文字而已。Article 物件還會暴露 texttitleauthorspublish_datetop_imageimagesmoviesmeta_descriptionmeta_langtagsarticle_html 等欄位。keywordssummary 則需要下面會提到的可選 NLP 安裝與語料設定。本次有盤點欄位,但沒有評分中繼資料的準確度。

測試版本:0.9.6、MIT 授權、1,135 個 GitHub stars,倉庫最後一次推送日期為 2026-07-31。這個日期只是快照,不能代表整體維護健康度。Python 3.14.2。

測試結果

函式庫文章召回率(共 22 個)樣板文字滲出內容詞精準率污染詞數量是否產生輸出
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。每個樣本中的每個單元都帶有獨特的識別標記,因此「找回」與「滲出」都是精確的子字串包含判定,而不是相似度分數。召回率是針對全部 22 個樣本計算;滲出率與精準率則是針對同時含有文章與樣板的 11 個樣本計算。

有三個欄位值得分開看。

它把每個頁面都輸出了。 goose3 和 jusText 沒做到——分別是 22 個裡面 20 個與 19 個。這點比表面看起來更重要,因為像這樣的精準率與 F1,都取決於有沒有產生輸出:如果某個函式庫回傳空字串,它就不會進入分子也不會進入分母,等於放棄的代價很低。goose3 的 1.0000 精準率,是在 11 個樣本中的 10 個上算出來的;newspaper4k 的 0.9452 則是在 11 個中的 11 個上算出來的。這兩者並不是完全相同的衡量方式。

它完全沒有滲出樣板。 這些樣本裡刻意加入了對抗性樣板——例如與文章並列的中性促銷區塊、看似無害 class 名稱的留言串、以及不直接寫著「ad」的廣告區塊。Readability 的 sibling-append 啟發式吞進去了其中幾個;newspaper4k 一個都沒有帶進來。

它只漏掉 74 個單元中的 1 個,而且這個漏失是共通的。

漏掉的是那個非純文字樣本——也就是由表格、程式碼區塊、短項目與圖片說明組成,而不是以段落為主的頁面——它漏掉的是 caption。而且它不是唯一會在這裡漏掉的工具:

函式庫非純文字頁面的召回率漏掉的單元
Readability1.000
jusText1.000
trafilatura0.875caption
resiliparse0.875caption
newspaper4k0.875caption
goose30.250兩個表格、程式碼區塊、兩個短項目、caption

有三個函式庫都漏掉了同一個 caption,而且沒有漏掉其他單元,這看起來不像三個獨立 bug,反而像是對 caption 這種內容價值的共通繼承假設。如果你的內容是文件、食譜,或任何 caption 承載了段落沒有的資訊,正式採用前一定要測;而 Readability 和 jusText 都把它保留了下來。

同一個樣本也是 goose3 失控的地方,它幾乎丟掉了整頁內容,所以「非純文字內容」這個維度,遠比總表看起來更能拉開這六個工具的差距。

在速度方面,newspaper4k 對這 22 個樣本的中位抽取時間是 2.69 ms,是六者中最慢的,最差情況達到 199.81 ms。相較於 resiliparse 的 0.06 ms 中位數,在這次受控測試中差了 45 倍。單頁流程裡,中位數也許不算大,但在高負載下的吞吐量與尾延遲,這裡並沒有測試。冷啟動匯入的成本會在後面另外說明。

我會先改掉的第一個預設值

System diagram: The default I would change on line one

官方參考:newspaper4k 文件

檢視隨附的 Configuration 物件,可以看到 22 個設定,其中之一是:

System diagram: Separate Fetching From Extraction

_honor_robotstxt = False

除非你明確告訴它,newspaper4k 不會理會 robots.txt。如果你讓它自己抓取——也就是使用 Article(url).download(),而沒有提供 input_html——它就會直接抓你指定的網址,不管網站的 robots 檔案怎麼寫。

對於一個主要用途是解析你手上已經有的 HTML 的函式庫來說,這樣的工程預設其實說得通;但如果你把它丟到正式環境後,才發現它會這樣抓取,那就很危險。若你要讓它抓取,請在 Configuration 裡把 honor_robotstxt=True 打開;或者像我在本次測試中一樣,直接傳入 input_html,由你自己負責抓取。

另外兩個也值得知道:

number_threads = 10 多文章工具的預設平行度是 10。平行不等於每秒請求數,但如果你沒有另外設定每個主機的限制與排程,它確實可能造成一波同步請求。

fetch_images = True 圖片抓取預設開啟,這會讓離線使用成為一個問題。在阻擋 socket.connect 的情況下,本次測試的 newspaper4k 0.9.6 路徑——也就是對一個已持有的 HTML 呼叫 download(input_html=…) 再接 parse()——能順利完成、回傳 1,292 個字元,且嘗試 0 次 網路連線。這只證明了這條特定路徑,不代表所有設定、外掛、內容型別或未來版本都一樣。

其餘預設值都算合理:min_word_count 300、min_sent_count 7、max_text 100,000、http_success_only True、memorize_articles True、follow_meta_refresh False、allow_binary_content False。

安裝與啟動現實面

pip install newspaper4k 會拉下 22 個套件47.5 MiB,大約花 6 秒。全新子程序的冷匯入時間是 2.812 s——在這份比較裡是最慢的。

函式庫套件數site-packages冷匯入時間抽取 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。每個函式庫都在各自全新的虛擬環境中安裝,因此不會繼承其他函式庫的相依項。

2.812 秒的匯入時間,是 resiliparse 15 毫秒的 187 倍。在長時間運作的工作程序裡,這只付一次,幾乎可以忽略;但在無伺服器函式裡,每次冷啟動都要付一次,而那種情況下,不管抽取表現多好,newspaper4k 都不是理想選擇。

安裝上還有一個小瑕疵:匯入時會印出警告:

UserWarning: nltk is not installed. Some NLP features will be unavailable. Install it with: pip install 'newspaper4k[nlp]'

本次測試完全不需要這些功能,而且在沒有它們的情況下,抽取也正常運作;但基礎安裝並不是完整安裝,newspaper4k[nlp] 會帶來更重的依賴樹與語料下載。只有在你真的需要關鍵字與摘要時,才應該把這部分成本算進去。

記憶體,以及破損 HTML 會怎麼影響它

這批評測中先前被列為未測的兩件事,現在都有量化了。

更大的壓力測試背景可參考十個函式庫的記憶體與錯誤 HTML 比較

峰值常駐記憶體 使用 /usr/bin/time -l 測得,每個格子都跑一個全新程序——匯入底線代表函式庫載入後閒置時的成本,峰值則包含文件本身。

函式庫執行環境匯入底線(MiB)226 KB HTML 峰值(MiB)10 MB HTML 峰值(MiB)
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 與 Node 的基準彼此不能直接比較;兩者內部都包含了直譯器本身。

newspaper4k 的底線是 52.6 MiB,而 10 MB HTML 的峰值是 668.5 MiB——在 Python 函式庫裡是第二重的。對一般頁面來說,這兩個數字都不算問題;但如果你是在記憶體受限的 worker 裡批次處理大型文件,這就很重要了。

破損 HTML。 這裡有 12 份文件,每份只壞一個地方——例如未關閉標籤、錯誤巢狀的 inline 元素、帶空格但未加引號的屬性、多餘的關閉標籤、完全沒有 <html>、重複屬性、在標籤中間截斷的文件、錯誤實體、未關閉的 <script>、故意說謊的字元編碼宣告、包含標記的註解,以及 600 層巢狀結構——另外再加上 兩份結構完整且大小相符的控制組,因為「它什麼都沒回傳」只有在函式庫對乾淨文件也同樣沉默時,才能說明它對破損的反應。

控制組與破損案例在原始結果中可以清楚分開:

群組文件數是否拋錯空輸出找回的評分 sentinel
結構完整且大小匹配的控制組200不納入破損評分
破損樣本120105/33,不含未關閉的<script> 案例

兩個控制組分別輸出了 70 與 1,351 個字元,而 12 個破損輸入中有 10 個回傳空字串。這表示,在這個樣本設計裡,空白輸出確實可歸因於 HTML 破損,而不是單純因為輸入太短。評分方式會在 11 份可計分的破損文件上檢查標題、段落與連結 sentinel。未關閉的 <script> 樣本則被排除,因為在 HTML5 解析規則下,後續標記仍屬於 script 內容。請參考malformed-results.json。這代表的是一項重要的恢復限制,選型時不能只看「沒有拋錯」。

優缺點整理

優勢。 在這次比較中沒有任何標註樣板 token,22 個受控文章樣本全部都有輸出,文章單元評分召回率達 0.9865。它能輸出文章文字與中繼資料欄位,不過中繼資料的準確性沒有測試。已持有 HTML 的測試路徑在 socket.connect 被封鎖時沒有任何網路嘗試。檢查當下倉庫有最近的日期型推送;更廣泛的維護健康度沒有評估。

劣勢。 本組中冷匯入最重,達 2.812 s,且實測 site-packages 為 22 個套件 / 47.5 MiB。honor_robotstxt 預設為 False,而多文章工具預設十個執行緒。基礎安裝會警告缺少 NLTK,所以關鍵字與摘要需要更重的可選安裝。最重要的是,12 個破損樣本中有 10 個回傳空輸出,即使兩個結構完整的控制組都能正常產生文字。

適合誰用,不適合誰用

如果你的優先順序是:在文章導向的受控資料集上產生非空文字、盡量避免標註樣板,並且可以接受較慢的冷啟動,那麼可以考慮 newspaper4k。依照這個明確規則,它在這次樣本比較中表現最好。若你的規則不同,也可以選 Readability,因為它保留了最多評分內容;或者選 resiliparse,因為它在啟動與中位抽取速度上更快。

如果你的情境是:冷啟動最重要、47.5 MiB 的實測 site-packages 不能接受,或者你很在意破損 HTML 的恢復能力,那就應該跳過它,或至少先做充分的 bake test。這裡 resiliparse 的匯入速度快了 187 倍,但它在所有品質欄位上也沒有與 trafilatura 完全打平:trafilatura 的文章召回率更高,而兩者在滲出與精準率上的輪廓也不同。newspaper4k 是以文章為中心設計的;商品列表與儀表板沒有測試,因此不能對那些場景做任何保證。

不管怎樣,只要它會自己抓取,就把 honor_robotstxt 打開。 這不是效能建議。

託管 API 何時適合

newspaper4k 可以解析呼叫端提供的 HTML,也有抓取路徑。託管式抽取服務則把取得內容、渲染與 schema 工作都交給供應商邊界處理。我們有在做 Thunderbit,但它沒有套用到這組樣本,因此這篇評測不包含任何品質、渲染、反機器人、延遲或成本比較。就已持有的文章 HTML 而言,這裡的證據只說明 newspaper4k 本身;非文章類目標還需要各自評估。

如果你想看同樣六個抽取器在同一組樣本上的比較,請參考六個函式庫的抽取比較

若你關注的是雲端服務,我們的網頁爬蟲 API 總整理會是更廣的視角;若想看自架替代方案,可參考開源爬蟲總論。如果文字最後要送進模型,用 Python 將 HTML 轉成 Markdown 會說明資訊保真在哪裡流失。

試用 Thunderbit 進行網頁資料擷取

要不要使用 newspaper4k?

如果 HTML 已經在手上,newspaper4k 可以先視為文章文字抽取的強力候選,再拿你的真實網站資料做一次 bake-off 後決定是否採用。受控樣本顯示它有很高的文章召回率、沒有標註樣板,而且在 22 個文章導向樣本上都能輸出非空內容。但這不涵蓋真實網頁或中繼資料準確性,而且 12 個破損樣本中有 10 個回傳空輸出。

如果你會用它的抓取路徑,請明確檢查 honor_robotstxt=False、十執行緒平行度,以及每個主機的限速控制。若冷啟動或依賴體積很重要,請在你的部署環境中實測 2.812 秒的本機匯入時間與 47.5 MiB 的 site-packages,而不要把它們當成通用容器成本。

試用 Thunderbit 進行網頁資料擷取 Get Started Free

常見問題

為什麼 set_html() 不能用? 因為 newspaper4k 裡根本沒有這個方法。HTML 要透過 download(input_html=html) 傳入,然後再呼叫 parse()。搜尋結果常會出現 newspaper3k 的範例,所以很容易搞混;我第一次跑的時候也踩到了這個坑,後來在評分前先把測試框架修正了。

newspaper4k 會尊重 robots.txt 嗎? 預設不會。honor_robotstxt 的出廠值是 False。如果你讓函式庫自己抓取,請在 Configuration 裡設成 True;或者直接傳入 input_html,自行負責抓取。多文章工作預設也會使用十個執行緒。這是未經你明確指定的平行度,不是固定請求速率;抓取時請自己設定每個主機的限制。

parse() 會發出網路請求嗎? 在 newspaper4k 0.9.6 中,本次測試的 download(input_html=…) 加上 parse() 路徑,當 socket.connect 被封鎖時,對一份已持有的 HTML 完全沒有任何連線嘗試。這並不代表所有解析設定、外掛、內容型別或未來版本都不會碰網路。

匯入時出現的 NLTK 警告是什麼? 基礎安裝不包含 NLTK,所以關鍵字抽取與摘要功能不可用,函式庫在匯入時也會提示這件事。抽取本身不受影響——這裡量測的所有項目都只用了基礎安裝。pip install 'newspaper4k[nlp]' 會把這些功能加上去,但也會帶來更重的依賴樹與語料下載。

這篇評測沒有測什麼? 真實世界的網頁——這些都是經過標註的受控樣本。中繼資料欄位有盤點,但沒有針對標題、作者、日期或圖片準確度打分。多語言抽取、NLP 額外功能、多執行緒來源抓取,以及高負載下的吞吐量也都沒有測。程序峰值記憶體只是在一個 226 KB 與一個 10 MB 的 HTML 輸入上測得,沒有並行或持續負載情境。

Ke
Ke
Thunderbit 技術長|資深資料科學家與機器學習專家 Ke Shen 在機器學習與資料科學領域擁有近十年經驗,畢業於哥倫比亞大學,曾任 Walmart Labs 資深資料科學家。他精通 Python、R、Java 與統計學,且具備深受同儕認可的深厚專業,分享如何將複雜的 AI 演算法從理論落實到可投入生產的架構的實戰見解。
目錄
Thunderbit · AI 網頁資料代理

1 次點擊 內擷取任何頁面的資料

獲 250,000+ 用戶信賴
提供免費方案
從網頁到試算表
描述你需要什麼——Thunderbit 的 AI Agent 會幫你抓取並匯出到 Excel、Google Sheets、Airtable 或 Notion。可免費開始。
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week