2010-05-19 128 views
7

我下載了維基百科轉儲,現在想刪除每個頁面的內容中的維基百科標記。我試圖編寫正則表達式,但它們太多無法處理。我找到了一個python庫,但我需要一個java庫,因爲我想集成到我的代碼中。維基百科:Java庫刪除維基百科文本標記刪除

謝謝。

+0

雲你發佈一個頁面的樣本,顯示你想刪除的標記嗎? – bakkal 2010-05-19 06:22:53

回答

9

做的兩個步驟:

  1. 讓一些現有的工具轉換MediaWiki的標記成純HTML;
  2. 將純HTML轉換爲文本。

以下演示:

import net.java.textilej.parser.MarkupParser; 
import net.java.textilej.parser.builder.HtmlDocumentBuilder; 
import net.java.textilej.parser.markup.mediawiki.MediaWikiDialect; 
import javax.swing.text.html.HTMLEditorKit; 
import javax.swing.text.html.parser.ParserDelegator; 
import java.io.StringReader; 
import java.io.StringWriter; 

public class Test { 

    public static void main(String[] args) throws Exception { 

     String markup = "This is ''italic'' and '''that''' is bold. \n"+ 
       "=Header 1=\n"+ 
       "a list: \n* item A \n* item B \n* item C"; 

     StringWriter writer = new StringWriter(); 

     HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer); 
     builder.setEmitAsDocument(false); 

     MarkupParser parser = new MarkupParser(new MediaWikiDialect()); 
     parser.setBuilder(builder); 
     parser.parse(markup); 

     final String html = writer.toString(); 
     final StringBuilder cleaned = new StringBuilder(); 

     HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() { 
       public void handleText(char[] data, int pos) { 
        cleaned.append(new String(data)).append(' '); 
       } 
     }; 
     new ParserDelegator().parse(new StringReader(html), callback, false); 

     System.out.println(markup); 
     System.out.println("---------------------------"); 
     System.out.println(html); 
     System.out.println("---------------------------"); 
     System.out.println(cleaned); 
    } 
} 

生產:

This is ''italic'' and '''that''' is bold. 
=Header 1= 
a list: 
* item A 
* item B 
* item C 
--------------------------- 
<p>This is <i>italic</i> and <b>that</b> is bold. </p><h1 id="Header1">Header 1</h1><p>a list: </p><ul><li>item A </li><li>item B </li><li>item C</li></ul> 
--------------------------- 
This is italic and that is bold. Header 1 a list: item A item B item C 
+0

你在哪裏下載你正在導入的java包? – jjxtra 2011-09-01 13:43:44

+0

@JJC,試試這裏:http://download.java.net/maven/2/net/java/textile-j/2.2/ – 2011-09-01 13:47:55

+0

我會盡力的,謝謝! – jjxtra 2011-09-01 19:56:56

1

Mylyn WikiText可以將各種Wiki語法轉換爲HTML和其他格式。它還支持MediaWiki語法,這是維基百科使用的語法。儘管Mylyn WikiText主要是Eclipse插件,但它也是available as standalone library

+0

我只需要一個可以從內容中刪除wiki標記的函數。我不確定如何使用mylyn刪除標記。你能告訴我該怎麼做。 – Boolean 2010-05-19 06:42:32

+0

@Algorist:Mylyn WikiText不會刪除標記,它會轉換爲其他格式。對不起,我誤解了你的問題。 – 2010-05-19 07:49:35

2

如果您需要純文本,您應該使用WikiClean庫https://github.com/lintool/wikiclean

我有同樣的問題,它看起來像這是在java中爲我工作的唯一有效的解決方案。

有兩種usecases:

1)當你在XML格式有文本沒有,那麼你應該加入這樣做處理所需的XML標記。假設您正在處理XML文件,現在您的內容沒有XML結構,那麼您只需像下面的代碼那樣添加xmlStartTag和xmlEndTag,然後對其進行處理。

String xmlStartTag = "<text xml:space=\"preserve\">"; 
String xmlEndTag = "</text>"; 
String articleWithXml = xmlStartTag + article.getText() + xmlEndTag; 
WikiClean cleaner = new WikiClean.Builder().build(); 
String plainWikiText = cleaner.clean(articleWithXml); 

2)當你正在閱讀的維基百科直接轉儲文件(XML文件),在這種情況下,你只是通過它通過文件,它經歷。

WikiClean cleaner = new WikiClean.Builder().build(); 
String plainWikiText = cleaner.clean(XMLFileContents); 
+0

歡迎來到Stack Overflow!問題不在於[幫助]中定義的Stack Overflow的主題。請不要回答這些問題;相反,你應該標記他們的注意力,他們將被關閉或適當遷移。 – 2018-01-16 15:52:03

+3

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18533404) – Bhuwan 2018-01-16 17:26:30

+0

謝謝@Bhuwan。我根據你的建議更新了我的答案。 – 2018-02-08 11:29:17