2009-07-07 33 views
9

我試圖解析(在Java中)維基媒體標記爲在維基百科上找到。這項任務有很多現有的軟件包,但我沒有找到任何適合我需求的特別好的軟件包。我與之合作的最好的軟件包是Mathclipse Bliki parser,它在大多數頁面上都做得不錯。解析wikimedia標記 - 是基於EBNF的解析器不太合適嗎?

但是,此解析器不完整,無法解析某些頁面或在其他頁面上錯誤解析。可悲的是,代碼相當混亂,因此修復這個解析引擎中的問題非常耗時且容易出錯。

在試圖找到一個更好的解析引擎時,我調查了使用基於EBNF的解析器來完成此任務(特別是ANTLR)。但經過一番嘗試,似乎這種方法並不是特別適合這項任務,因爲維基媒體標記相對寬鬆,因此不容易適應結構化語法。

但是,我對ANTLR和類似解析器的使用經驗非常有限,所以可能是我的經驗不足而導致問題,而不是解析器本身不適合執行此任務。任何有這些主題經驗的人都可以在這裏權衡嗎?

@Stobor:我提到過我已經看過各種解析引擎,包括google查詢返回的引擎。迄今爲止發現的最好的是Bliki發動機。問題在於解決這些解析器的問題變得令人難以置信的乏味,因爲它們都基本上是條件和正則表達式的長鏈,導致了意大利麪代碼。我在尋找更類似於EBNF解析方法的東西,因爲該方法更清晰,更簡潔,因而更易於理解和發展。我已經看到了您發佈的mediawiki鏈接,似乎證實了我的懷疑,即EBNF開箱即用並不適合執行此任務。因此,我正在尋找一種解析引擎,它像EBNF一樣清晰易懂,但也能夠處理維基標記的混亂語法。

+0

這可能是好的,如果你能指出一對夫婦的需求未被滿足由http://google.com/search?q=wikipedia+java+parser上的熱門搜索結果,因此我們可以提供更好的答案... – Stobor 2009-07-15 05:59:33

+0

另請參見:http://www.mediawiki.org/wiki/Markup_spec/BNF – Stobor 2009-07-15 06:00:45

回答

4

解析任何一般意義上的mediawiki內容幾乎是不可能的短的使用mediawiki本身。爲了解析它,你需要能夠完全解析HTML和CSS(因爲它們可以被嵌入),並且處理完整的模板實例化和擴展,以及相關內容可能已經使用的任何解析器添加。該模板實例等同於預處理器。

與解析C++類似,除了解析器還處理格式不正確的輸入和解析器擴展所做的任意語法添加。實際的mediawiki實現與Perl 5非常類似,原始實現並不是那麼糟糕,因爲所有的邊緣案例都會掉線,但是事物之間是聯繫在一起的,但實際上獲得後續實現來做同樣的事情是非常複雜的,特別是行爲往往是緊急和無證的,沒有設計。

如果你不需要100%的頁面工作或能夠提取所有內容,你可能會湊齊一些適合你的東西,正如你已經注意到的那樣,有一些包可以做到這一點。不知道你的實際確切需求,我懷疑任何人都可以給你一個關於如何解析它的更好的答案。如果你需要能夠在每個頁面上工作,並正確解析所有你最好有一個相當大的團隊和幾年的工作,即使如此,你仍然有很多小的邊緣情況。

因此,在短期,沒有一個EBNF語法是不適合的mediawiki解析標記,但沒有什麼是...

3

你是對的維基媒體不適合EBNF定義明確的文法。

你必須看一看將回溯到能夠解析維基

btyacc這是一個回溯YACC工具。 http://www.siber.com/btyacc/

你可以看看Accent。比Yacc更好 http://accent.compilertools.net/

或者你可能需要分解和學習一些prolog的風格和你自己的卷。無論你做什麼,你都有一段有趣的學習時光。

好運

1

我曾經試着寫一個解析器Boost.Quickbook,這在本質上是相同的,通過使用維基百科維基文本。

這是一個非常繁瑣的過程,只是爲了獲得一些基礎知識,但我認爲最終有可能爲它編寫EBNF語法。如果您有興趣,my partial parser可以在線獲得(語法嵌入在文檔字符串中)。

0

這個答案在那裏有一點點,但是如何渲染文本,然後解析HTML Dom以找出不同的wiki組件。