解析输入时,Java会错误解释撇号

时间:2015-03-04 03:58:45

标签: java json parsing

所以我试图使用维基百科api来阅读给定维基百科页面的第一段。不幸的是,我维基百科使用一个奇怪的系统来处理特殊字符,(http://www.mediawiki.org/wiki/API:Data_formats#JSON_parameters)并且我无法解析默认的response而无法获取具有转义序列的字符。显然最好的解决方案是直接在java中解释这些,但我不确定是否有办法做到这一点,所以我强制使用utf8 response。这种方法看起来应该可行,但是当我通过我的解析代码传递它时,它会返回:

Ella Marija Lani Yelich-O'Connor (born 7 November 1996).....named among Time?'?s most influential teenagers in the world, and in the following year, she made her way into Forbes?'?s "30 Under 30" list.

请注意,保留了一些撇号,有些则没有。我认为错误解释的字符是解析先前解析的结果(我想要明文,所以我解析出html标签)。这是我的解析代码,它有点乱,但它几乎可以工作:

public static String getWikiParagraph (String url){
    try {
        //System.out.println(url.substring(url.lastIndexOf('/') + 1));
        URL apiURL = new URL("http://www.en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&utf8&exintro=&titles="+url.substring(url.lastIndexOf('/') + 1));
        BufferedReader br = new BufferedReader(new InputStreamReader(apiURL.openStream(), Charset.forName("UTF-8")));
        StringBuilder sb=new StringBuilder();
        String read = br.readLine();
        while(read != null) {
            sb.append(read);
            read =br.readLine();
        }
        String s = sb.toString();
        s = Arrays.toString(getTagValues(s).toArray());
        s=s.replace("<i>","");
        s=s.replace("</i>","");
        s=s.replace("?'?","'"); //makes no difference in output
        s=s.replace("u200a","");
        s=s.replace("<b>","");
        s=s.replace("</b>","");
        s=s.replace("\\","");
        s=s.substring(1, s.length() -1);
        return s;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch(IOException e){
        System.out.println("Error fetching data from url");
    }
    return null;
}

private static List<String> getTagValues(final String str) {
    final Pattern TAG_REGEX = Pattern.compile("<p>(.+?)</p>");
    final List<String> tagValues = new ArrayList<String>();
    final Matcher matcher = TAG_REGEX.matcher(str);
    while (matcher.find()) {
        tagValues.add(matcher.group(1));
    }
    return tagValues;
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用JSON解析器并通过JSoup之类的内容运行要清除的结果。当然,你可以编写自己的脆弱的HTML解析器,但这是一个傻瓜的差事。 HTML很微妙,很快就会生气。花时间构建你的逻辑,让实用程序类做一些蹩脚的东西。

而且,是的。评论是正确的。这个JSON中有Unicode序列,至少在我查看该URL时,大多数终端都无法正确呈现。

修改

JSON格式(显然)可能会发生变化。我通过在URL中指定“&amp; continue =”来恢复输出,以恢复较旧的延续格式。你应该知道这些延续格式变化对你意味着什么。