爬蟲智慧解析庫 Readability 和 Newspaper 的用法

進擊的Coder 發表於 2022-12-06
爬蟲

輿情爬蟲是網路爬蟲一個比較重要的分支,輿情爬蟲往往需要爬蟲工程師爬取幾百幾千個新聞站點。比如一個新聞頁面我們需要爬取其標題、正文、時間、作者等資訊,如果用傳統的方式來實現,每一個站點都要配置非常多的規則,如果要維護一個幾百上千的站點,那人力成本簡直太高了。

如果有一種方式可以在保證差不多的準確率的前提下,大幅提高提取效率的話,就需要用到智慧文字提取了。

本文首先介紹一下智慧文字提取的基本原理,讓大家對智慧提取有基本的瞭解。然後介紹幾個比較基礎的工具包,準確率並不是很高,可以嘗試一用。最後再介紹幾篇比較前沿的技術供大家參考。

智慧文字提取

目前來說,智慧文字提取可以分為三類:

  • 基於網頁文件內容的提取方法

  • 基於 DOM 結構資訊的提取方法

  • 基於視覺資訊的提取方法

基於網頁文件的提取方法將 HTML 文件視為文字進行處理,適用於處理含有大量文字資訊且結構簡單易於處理的單記錄網頁,或者具有實時要求的線上分析網頁應用。這種方式主要利用自然語言處理相關技術實現,透過理解 文字語義、分析上下文、設定提取規則等,實現對大段網頁文件的快速處理。其中,較為知名的方法有TSIMMIS、Web-OQL、Serrano、FAR-SW 和 FOREST,但這些方法由於通常需要人工的參與,且存在耗時長、效率低的弊端。

基於 DOM 結構資訊的方法將 HTML 文件解析為相應的 DOM 樹,然後根據 DOM 樹的語法結構建立提取規則, 相對於以前的方法而言有了更高的效能和準確率。W4F 和 XWRAP 將 HTML 文件解析成 DOM 樹,然後透過元件化引導使用者透過人工選擇或者標記生成目標包裝器程式碼。Omini、IEPAD 和 ITE 提取 DOM 樹上的關鍵路徑, 獲取其中存在的重複模式。MDR 和 DEPTA 挖掘了頁面中的資料區域,得到資料記錄的模式。CECWS 透過聚類演算法從資料庫中提取出自同一網站的一組頁面,並進行 DOM 樹結構的對比,刪除其中的靜態部分,保留動態內容作為資訊提取的結果。雖然此類方法相對於上一類方法 具有較高的提取精度,且克服了對大段連續文字的依賴, 但由於網頁的 DOM 樹通常較深,含有大量 DOM 節點, 因此基於 DOM 結構資訊的方法具有較高的時間和空間消耗。目前來說,大部分原理還是基於 DOM 節點的文字密度、標點符號密度等計算的,其準確率還是比較可觀的。今天所介紹的 Readability 和 Newspaper 的庫的實現原理就是類似。

目前比較先進的是基於視覺資訊的網頁資訊提取方法,透過瀏覽器介面或者核心對目標網頁預渲染,然後基於網頁的視覺規律提取網頁資料記錄。經典的 VIPS 演算法首先從 DOM 樹中提取出所有合適的頁面區域,然後根據這些頁面和分割條重新構建 Web 頁面的語義結構。作為對 VIPS 的擴充,ViNT、ViPER、ViDE 也成功利用了網頁的視覺特徵來實現資料提取。CMDR 為透過神經網路學習多記錄型頁面中的特徵,結合基於 DOM 結構資訊的 MDR 方法,挖掘社群論壇頁面的資料區域。與上述方法不同,VIBS 將影像領域的 CNN 卷積神經網路運用於網頁的截圖,同時透過類 VIPS 演算法生成視覺塊,最後結合兩個階段的結果識別網頁的正文區域。另外還有最新的國內提出的 VBIE 方法,基於網頁視覺的基礎上改進,可以實現無監督的網頁資訊提取。

以上內容主要參考自論文:《王衛紅等:基於可視塊的多記錄型複雜網頁資訊提取演算法》,演算法可從該論文參考文獻查閱。

下面我們來介紹兩個比較基礎的工具包 Readability 和 Newspaper 的用法,這兩個包經我測試其實準確率並不是很好,主要是讓大家大致對智慧解析有初步的理解。後面還會介紹一些更加強大的智慧化解析演算法。

Readability

Readability 實際上是一個演算法,並不是一個針對某個語言的庫。其主要原理就是計算了 DOM 的文字密度,另外根據一些常見的 DOM 屬性如 id、class 等計算了一些 DOM 的權重,最後分析得到了對應的 DOM 區塊,進而提取出具體的文字內容。

現在搜尋 Readability 其實已經找不到了,取而代之的是一個 JavaScript 工具包,叫做 mercury-parser,據我所知應該是 Readability 不維護了,換成了 mercury-parser。後者現在也做成了一個 Chrome 外掛,大家可以下載使用一下。

迴歸正題,這次主要介紹的是 Python 的 Readability 實現,現在其實有很多開源版本,本文選取的是 ,是基於最早的 Python 版本的 Readability 庫 二次開發的,現在已經發布到了 PyPi,大家可以直接下載安裝使用。

安裝很簡單,透過 pip 安裝即可:

pip3 install readability-lxml

安裝好了之後便可以透過匯入 readability 使用了,下面我們隨便從網上找一個新聞頁面,比如:,其頁面截圖如下:

爬蟲智慧解析庫 Readability 和 Newspaper 的用法

我們的目的就是它的正文、標題等內容。下面我們用 Readability 試一下,示例如下:

import requests
from readability import Document

url = ''
html = requests.get(url).content
doc = Document(html)
print('title:', doc.title())
print('content:', doc.summary(html_partial=True))

在這裡我們直接用 requests 庫對網頁進行了請求,獲取了其 HTML 頁面內容,賦值為 html。

然後引入了 readability 裡的 Document 類,使用 html 變數對其進行初始化,然後我們分別呼叫了 title 方法和 summary 方法獲得了其標題和正文內容。

這裡 title 方法就是獲取文章標題的,summary 就是獲取文章正文的,但是它獲取的正文可能包含一些 HTML 標籤。這個 summary 方法可以接收一個 html_partial 引數,如果設定為 True,返回的結果則不會再帶有 <html><body> 標籤。

看下執行結果:

title: 今年iPhone只有小改進?分析師:還有其他亮點_網易科技
content: <div><div class="post_text" id="endText">           
                    <p class="otitle">
                        (原標題:Apple Bets More Cameras Can Keep iPhone Humming)
                    </p>
                    <p class="f_center"><img alt="今年iPhone只有小改進?分析師:還有其他亮點" src="/><span>圖示:蘋果執行長蒂姆·庫克(Tim Cook)在6月份舉行的蘋果全球開發者大會上。</span></p><p>網易科技訊 9月9日訊息,據國外媒體報導,和過去的12個年頭一樣,新款
... 中間省略 ...
                    <p>蘋果還即將推出包括電視節目和影片遊戲等內容的新訂閱服務。分析師表示,該公司最早可能在本週宣佈TV+和Arcade等服務的價格和上線時間。</p><p>Strategy Analytics的尼爾·莫斯頓(Neil Mawston)表示,可穿戴裝置和服務的結合將是蘋果業務超越iPhone的關鍵。他說,上一家手機巨頭諾基亞公司在試圖進行類似業務轉型時就陷入了困境之中。(辰辰)</p><p><b>相關報導:</b></p><p><a href=" target="_self" urlmacroreplace="false">iPhone 11背部蘋果Logo改為居中:為反向無線充電</a></p><p><a href=" target="_self" urlmacroreplace="false">2019年新iPhone傳言彙總,你覺得哪些能成真</a>  </p><p/>
                        <p/>
                        <div class="ep-source cDGray">
                            <span class="left"><a href="><img src=" alt="王鳳枝" class="icon"/></a> 本文來源:網易科技報導  </span>
                            <span class="ep-editor">責任編輯:王鳳枝_NT2541</span>
                        </div>
                </div> 
</div>

可以看到,標題提取是正確的。正文其實也是正確的,不過這裡還包含了一些 HTML 標籤,比如 <img><p> 等,我們可以進一步透過一些解析庫來解析。

看下原始碼吧,比如提取標題的方法:

def normalize_entities(cur_title):
    entities = {
        u'\u2014':'-',
        u'\u2013':'-',
        u'&mdash;''-',
        u'&ndash;''-',
        u'\u00A0'' ',
        u'\u00AB''"',
        u'\u00BB''"',
        u'&quot;''"',
    }
    for c, r in entities.items():
        if c in cur_title:
            cur_title = cur_title.replace(c, r)

    return cur_title

def norm_title(title):
    return normalize_entities(normalize_spaces(title))

def get_title(doc):
    title = doc.find('.//title')
    if title is None or title.text is None or len(title.text) == 0:
        return '[no-title]'

    return norm_title(title.text)

 def title(self):
    """Returns document title"""
    return get_title(self._html(True))

title 方法實際上就是呼叫了一個 get_title 方法,它怎麼做的?實際上就是用了一個 XPath 只解析了 <title> 標籤裡面的內容,別的沒了。如果沒有,那就返回 [no-title]

def summary(self, html_partial=False):
    ruthless = True
    while True:
        self._html(True)
        for i in self.tags(self.html, 'script''style'):
            i.drop_tree()
        for i in self.tags(self.html, 'body'):
            i.set('id''readabilityBody')
        if ruthless:
            self.remove_unlikely_candidates()
        self.transform_misused_divs_into_paragraphs()
        candidates = self.score_paragraphs()

        best_candidate = self.select_best_candidate(candidates)

        if best_candidate:
            article = self.get_article(candidates, best_candidate,
                                       html_partial=html_partial)
        else:
            if ruthless:
                ruthless = False
                continue
            else:
                article = self.html.find('body')
                if article is None:
                    article = self.html
        cleaned_article = self.sanitize(article, candidates)
        article_length = len(cleaned_article or '')
        retry_length = self.retry_length
        of_acceptable_length = article_length >= retry_length
        if ruthless and not of_acceptable_length:
            ruthless = False
            continue
        else:
            return cleaned_article

這裡我刪除了一些冗餘的除錯的程式碼,只保留了核心的程式碼,其核心實現就是先去除一些干擾內容,然後找出一些疑似正文的 candidates,然後再去尋找最佳匹配的 candidates 最後提取其內容返回即可。

然後再找到獲取 candidates 方法裡面的 score_paragraphs 方法,又追蹤到一個 score_node 方法,就是為每一個節點打分的,其實現如下:

def score_node(self, elem):
    content_score = self.class_weight(elem)
    name = elem.tag.lower()
    if name in ["div""article"]:
        content_score += 5
    elif name in ["pre""td""blockquote"]:
        content_score += 3
    elif name in ["address""ol""ul""dl""dd""dt""li""form""aside"]:
        content_score -= 3
    elif name in ["h1""h2""h3""h4""h5""h6""th""header""footer""nav"]:
        content_score -= 5
    return {
        'content_score': content_score,
        'elem': elem
    }

這什麼意思呢?你看如果這個節點標籤是 div 或者 article 等可能表徵正文區塊的話,就加 5 分,如果是 aside 等表示側欄的內容就減 3 分。這些打分也沒有什麼非常標準的依據,可能是根據經驗累積的規則。

另外還有一些方法裡面引用了一些正則匹配來進行打分或者替換,其定義如下:

REGEXES = {
    'unlikelyCandidatesRe': re.compile('combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup|tweet|twitter', re.I),
    'okMaybeItsACandidateRe': re.compile('and|article|body|column|main|shadow', re.I),
    'positiveRe': re.compile('article|body|content|entry|hentry|main|page|pagination|post|text|blog|story', re.I),
    'negativeRe': re.compile('combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget', re.I),
    'divToPElementsRe': re.compile('<(a|blockquote|dl|div|img|ol|p|pre|table|ul)', re.I),
    #'replaceBrsRe': re.compile('(<br[^>]*>[ \n\r\t]*){2,}',re.I),
    #'replaceFontsRe': re.compile('<(\/?)font[^>]*>',re.I),
    #'trimRe': re.compile('^\s+|\s+$/'),
    #'normalizeRe': re.compile('\s{2,}/'),
    #'killBreaksRe': re.compile('(<br\s*\/?>(\s|&nbsp;?)*){1,}/'),
    'videoRe': re.compile('https?:\/\/(www\.)?(youtube|vimeo)\.com', re.I),
    #skipFootnoteLink:      /^\s*(\[?[a-z0-9]{1,2}\]?|^|edit|citation needed)\s*$/i,
}

比如這裡定義了 unlikelyCandidatesRe,就是不像 candidates 的 pattern,比如 foot、comment 等等,碰到這樣的標籤或 pattern 的話,在計算分數的時候都會減分,另外還有其他的 positiveRe、negativeRe 也是一樣的原理,分別對匹配到的內容進行加分或者減分。

這就是 Readability 的原理,是基於一些規則匹配的打分模型,很多規則其實來源於經驗的累積,分數的計算規則應該也是不斷地調優得出來的。

另外其他的就沒了,Readability 並沒有提供提取時間、作者的方法,另外此種方法的準確率也是有限的,但多少還是省去了一些人工成本。

Newspaper

另外還有一個智慧解析的庫,叫做 Newspaper,提供的功能更強一些,但是準確率上個人感覺和 Readability 差不太多。

這個庫分為 Python2 和 Python3 兩個版本,Python2 下的版本叫做 newspaper,Python3 下的版本叫做 newspaper3k,這裡我們使用 Python3 版本來進行測試。

其 GitHub 地址是:,官方文件地址是:。

在安裝之前需要安裝一些依賴庫,可以參考官方的說明:#get-it-now。

安裝好必要的依賴庫之後,就可以使用 pip 安裝了:

pip3 install newspaper3k

安裝成功之後便可以匯入使用了。

下面我們先用官方提供的例項來過一遍它的用法,官方提供的示例是使用了這個連結:,其頁面截圖如下:

爬蟲智慧解析庫 Readability 和 Newspaper 的用法

下面用一個例項來感受一下:

from newspaper import Article

url = ''
article = Article(url)
article.download()
# print('html:', article.html)

article.parse()
print('authors:', article.authors)
print('date:', article.publish_date)
print('text:', article.text)
print('top image:', article.top_image)
print('movies:', article.movies)

article.nlp()
print('keywords:', article.keywords)
print('summary:', article.summary)

這裡從 newspaper 庫裡面先匯入了 Article 這個類,然後直接傳入 url 即可,首先需要呼叫它的 download 方法,將網頁爬取下來,否則直接進行解析會丟擲錯誤的。

但我總感覺這個設計挺不友好的,parse 方法不能判斷下,如果沒執行 download 就自動執行 download 方法嗎?如果不 download 其他的不什麼都幹不了嗎?

好的,然後我們再執行 parse 方法進行網頁的智慧解析,這個功能就比較全了,能解析 authors、publish_date、text 等等,除了正文還能解析作者、釋出時間等等。

另外這個庫還提供了一些 NLP 的方法,比如獲取關鍵詞、獲取文字摘要等等,在使用前需要先執行以下 nlp 方法。

最後執行結果如下:

authors: ['Cnn Wire']
date: 2013-12-30 00:00:00
text: By Leigh Ann Caldwell

WASHINGTON (CNN) — Not everyone subscribes to a New Year’s resolution, but Americans will be required to follow new laws in 2014.

Some 40,000 measures taking effect range from sweeping, national mandates under Obamacare to marijuana legalization in Colorado, drone prohibition in Illinois and transgender protections in California.

Although many new laws are controversial, they made it through legislatures, public referendum or city councils and represent the shifting composition of American beliefs.
...
...
Colorado: Marijuana becomes legal in the state for buyers over 21 at a licensed retail dispensary.

(Sourcing: much of this list was obtained from the National Conference of State Legislatures).
top image: https://localtvkstu.files.wordpress.com/2012/04/national-news-e1486938949489.jpg?quality=85&strip=all
movies: []
keywords: ['drones''national''guns''wage''law''pot''leave''family''states''state''latest''obamacare''minimum''laws']
summary: Oregon: Family leave in Oregon has been expanded to allow eligible employees two weeks of paid leave to handle the death of a family member.
Arkansas: The state becomes the latest state requiring voters show a picture ID at the voting booth.
Minimum wage and former felon employmentWorkers in 13 states and four cities will see increases to the minimum wage.
New Jersey residents voted to raise the state’s minimum wage by $1 to $8.25 per hour.
California is also raising its minimum wage to $9 per hour, but workers must wait until July to see the addition.

這裡省略了一些輸出結果。

可以看到作者、日期、正文、關鍵詞、標籤、縮圖等資訊都被列印出來了,還算是不錯的。

但這個畢竟是官方的例項,肯定是好的,我們再測試一下剛才的例子,看看效果如何,網址還是:,改寫程式碼如下:

from newspaper import Article

url = ''
article = Article(url, language='zh')
article.download()
# print('html:', article.html)

article.parse()
print('authors:', article.authors)
print('title:', article.title)
print('date:', article.publish_date)
print('text:', article.text)
print('top image:', article.top_image)
print('movies:', article.movies)

article.nlp()
print('keywords:', article.keywords)
print('summary:', article.summary)

這裡我們將連結換成了新聞的連結,另外在 Article 初始化的時候還加了一個引數 language,其值為 zh,代表中文。

然後我們看下執行結果:

Building prefix dict from /usr/local/lib/python3.7/site-packages/jieba/dict.txt ...
Dumping model to file cache /var/folders/1g/l2xlw12x6rncs2p9kh5swpmw0000gn/T/jieba.cache
Loading model cost 1.7178938388824463 seconds.
Prefix dict has been built succesfully.
authors: []
title: 今年iPhone只有小改進?分析師:還有其他亮點
date2019-09-09 08:10:26+08:00
text: (原標題:Apple Bets More Cameras Can Keep iPhone Humming)

圖示:蘋果執行長蒂姆·庫克(Tim Cook)在6月份舉行的蘋果全球開發者大會上。

網易科技訊 99日訊息,據國外媒體報導,和過去的12個年頭一樣,新款iPhone將成為蘋果公司本週所舉行年度宣傳活動的主角。但人們的注意力正轉向需要推動增長的其他蘋果產品和服務。
...
...
Strategy Analytics的尼爾·莫斯頓(Neil Mawston)表示,可穿戴裝置和服務的結合將是蘋果業務超越iPhone的關鍵。他說,上一家手機巨頭諾基亞公司在試圖進行類似業務轉型時就陷入了困境之中。(辰辰)

相關報導:

iPhone 11背部蘋果Logo改為居中:為反向無線充電

2019年新iPhone傳言彙總,你覺得哪些能成真
top image: .163.com/favicon.ico
movies: []
keywords: ['trust高階投資組合經理丹摩根dan''iphone''mawston表示可穿戴裝置和服務的結合將是蘋果業務超越iphone的關鍵他說上一家手機巨頭諾基亞公司在試圖進行類似業務轉型時就陷入了困境之中辰辰相關報導iphone''xs的銷售疲軟狀況迫使蘋果在1月份下調了業績預期這是逾15年來的第一次據貿易公司susquehanna''xs機型釋出後那種令人失望的業績重演iphone''今年iphone只有小改進分析師還有其他亮點''more''xr和iphone''morgan說他們現在沒有任何真正深入的進展只是想繼續讓iphone這款業務繼續轉下去他樂觀地認為今年釋出的新款手機將有足夠多的新功能為一個非常成熟的產品增加額外的功能讓火車繼續前進這種僅限於此的態度說明了蘋果自2007年釋出首款iphone以來所面臨的挑戰iphone銷售佔蘋果公司總營收的一半以上這讓蘋果陷入了一個尷尬的境地既要維持核心產品的銷量另一方面又需要減少對它的依賴瑞銀ubs今年5月份對8000名智慧手機使用者進行了相關調查其釋出的年度全球調查報告顯示最近iphone在人臉識別技術等方面的進步並沒有引起一些消費者的共鳴他們基本上都認為蘋果產品沒有過去幾年那麼獨特或者驚豔品牌也沒有過去幾年那麼有吸引力很多人使用老款手機的時間更長自己認為也沒有必要升級到平均售價949美元的新款iphone蘋果需要在明年銷售足夠多的iphone以避免像去年9月份iphone''keep''原標題apple']
summary: (原標題:Apple Bets More Cameras Can Keep iPhone Humming)圖示:蘋果執行長蒂姆·庫克(Tim Cook)在6月份舉行的蘋果全球開發者大會上。網易科技訊 99日訊息,據國外媒體報導,和過去的12個年頭一樣,新款iPhone將成為蘋果公司本週所舉行...亞公司在試圖進行類似業務轉型時就陷入了困境之中。(辰辰)相關報導:iPhone 11背部蘋果Logo改為居中:為反向無線充電2019年新iPhone傳言彙總,你覺得哪些能成真

中間正文很長省略了一部分,可以看到執行時首先載入了一些中文的庫包,比如 jieba 所依賴的詞表等等。

解析結果中,日期的確是解析對了,因為這個日期格式的的確比較規整,但這裡還自動給我們加了東八區的時區,貼心了。作者沒有提取出來,可能是沒匹配到 來源 兩個字吧,或者詞庫裡面沒有,標題、正文的提取還算比較正確,也或許這個案例的確是比較簡單。

另外對於 NLP 部分,獲取的關鍵詞比較迷,長度有點太長了。summary 也有點冗餘。

另外 Newspaper 還提供了一個較為強大的功能,就是 build 構建資訊源。官方的介紹其功能就是構建一個新聞源,可以根據傳入的 URL 來提取相關文章、分類、RSS 訂閱資訊等等。

我們用例項感受一下:

import newspaper

source = newspaper.build(', language='zh')
for category in source.category_urls():
    print(category)

for article in source.articles:
    print(article.url)
    print(article.title)

for feed_url in source.feed_urls():
    print(feed_url)

在這裡我們傳入了新浪的官網,呼叫了 build 方法,構建了一個 source,然後輸出了相關的分類、文章、RSS 訂閱等內容,執行結果如下:

http://cul.news.sina.com.cn
http://
http://sc.sina.com.cn
http://jiangsu.sina.com.cn
http://gif.sina.com.cn
....
http://tj.sina.com.cn
http://travel.sina.com.cn
http://jiaoyi.sina.com.cn
http://cul.sina.com.cn
https://finance.sina.com.cn/roll/2019-06-12/doc-ihvhiqay5022316.shtml 
經參頭版:激發微觀主體活力加速國企改革
http://eladies.sina.com.cn/feel/xinli/2018-01-25/0722/doc-ifyqwiqk0463751.shtml 
我們別再聯絡了
http://finance.sina.com.cn/roll/2018-05-13/doc-ihamfahx2958233.shtml 
新違約時代到來!違約“常態化”下的市場出清與換血
http://sports.sina.com.cn/basketball/2019worldcup/2019-09-08/doc-iicezzrq4390554.shtml 
羅健兒26分韓國收首勝
...
http://travel.sina.com.cn/outbound/pages/2019-09-05/detail-iicezzrq3622449.shtml 
菲律賓海濱大道 夜晚讓人迷離
http://travel.sina.com.cn/outbound/pages/2016-08-19/detail-ifxvcnrv0334779.shtml  
關島 用雙腳盡情享受陽光與海灘
http://travel.sina.com.cn/domestic/pages/2019-09-04/detail-iicezzrq3325092.shtml 
秋行查干浩特草原
http://travel.sina.com.cn/outbound/pages/2019-09-03/detail-iicezueu3050710.shtml 
白羊座的土豪之城杜拜
http://travel.sina.com.cn/video/baidang/2019-08-29/detail-ihytcitn2747327.shtml 
肯辛頓宮藏著維多利亞的秘密
http://cd.auto.sina.com.cn/bdcs/2017-08-15/detail-ifyixias1051586.shtml 

可以看到它輸出了非常多的類別連結,另外還有很多文章列表,由於沒有 RSS 訂閱內容,這裡沒有顯示。

下面把站點換成我的部落格:https://cuiqingcai.com,部落格截圖如下:

爬蟲智慧解析庫 Readability 和 Newspaper 的用法

部落格截圖

看看執行結果:

https://cuiqingcai.com
https://cuiqingcai.com

似乎不太行啊,一篇文章都沒有,RSS 也沒有,可見其功能還有待最佳化。

Newspaper 的基本用法介紹到這裡,更加詳細的用法可以參考官方文件:。個人感覺其中的智慧解析可以用用,不過據我的個人經驗,感覺還是很多解析不對或者解析不全的,

以上便是 Readability 和 Newspaper 的介紹。

其他方案

另外除了這兩個庫其實還有一些比較優秀的演算法,由於我們處理的大多為中文文件,所以一些在中文上面的研究是比較有效的,在這裡列幾個值得借鑑的中文論文供大家參考:

  • 洪鴻輝等,基於文字及符號密度的網頁正文提取方法

  • 梁東等,基於支援向量機的網頁正文內容提取方法

  • 王衛紅等,基於可視塊的多記錄型複雜網頁資訊提取演算法

今天還看到一位大佬「青南」根據上面第一篇論文所實現的 GeneralNewsExtractor,GitHub 地址為:,經測試準確率還不錯,比 Readability 和 Newspaper 的解析效果要好。我也跟作者進行了交流,後續可能還會基於其他的 Feature 或依賴於視覺化的方法進行最佳化,大家可以關注下,謝謝!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557738/viewspace-2658869/,如需轉載,請註明出處,否則將追究法律責任。