2010-05-19 110 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