開發這個項目,源自於我在知網發現了一篇關於自動化抽取新聞類網站正文的算法論文——《基於文本及符號密度的網頁正文提取方法》html
這篇論文中描述的算法看起來簡潔清晰,而且符合邏輯。但因爲論文中只講了算法原理,並無具體的語言實現,因此我使用 Python 根據論文實現了這個抽取器。並分別使用今日頭條、網易新聞、遊民星空、觀察者網、鳳凰網、騰訊新聞、ReadHub、新浪新聞作了測試,發現提取效果很是出色,幾乎可以達到100%的準確率。node
在論文中描述的正文提取基礎上,我增長了標題、發佈時間和文章做者的自動化探測與提取功能。python
最後的輸出效果以下圖所示:git
目前這個項目是一個很是很是早期的 Demo,發佈出來是但願可以儘快獲得你們的使用反饋,從而可以更好地有針對性地進行開發。github
本項目取名爲抽取器
,而不是爬蟲
,是爲了規避沒必要要的風險,所以,本項目的輸入是 HTML,輸出是一個字典。請自行使用恰當的方法獲取目標網站的 HTML。正則表達式
本項目如今不會,未來也不會提供主動請求網站 HTML 的功能。算法
項目代碼中的GeneralNewsCrawler.py
提供了本項目的基本使用示例。後端
test
文件夾中開發者工具
,以下圖所示:在Elements
標籤頁定位到<html>
標籤,並右鍵,選擇Copy
-Copy OuterHTML
,以下圖所示瀏覽器
固然,你可使用 Puppeteer/Pyppeteer、Selenium 或者其餘任何方式獲取目標頁面的JavaScript渲染後的
源代碼。微信
獲取到源代碼之後,經過以下代碼提取信息:
from GeneralNewsCrawler import GeneralNewsExtractor
extractor = GeneralNewsExtractor()
html = '你的目標網頁正文'
result = extractor.extract(html)
print(result)
複製代碼
對大多數新聞頁面而言,以上的寫法就可以解決問題了。
但某些新聞網頁下面會有評論,評論裏面可能存在長篇大論,它們會看起來比真正的新聞正文更像是正文,所以extractor.extract()
方法還有一個默認參數noise_mode_list
,用於在網頁預處理時提早把評論區域整個移除。
noise_mode_list
的值是一個列表,列表裏面的每個元素都是 XPath,對應了你須要提早移除的,可能會致使干擾的目標標籤。
例如,觀察者網
下面的評論區域對應的Xpath 爲//div[@class="comment-list"]
。因此在提取觀察者網時,爲了防止評論干擾,就能夠加上這個參數:
result = extractor.extract(html, noise_node_list=['//div[@class="comment-list"]'])
複製代碼
test
文件夾中的網頁的提取結果,請查看result.txt
。
驗證消息:GNE