【问题标题】:Java misinterpreting apostrophes when parsing input解析输入时Java误解撇号
【发布时间】:2015-03-04 03:58:44
【问题描述】:

所以我正在尝试使用 wikipedia api 来阅读给定 wikipedia 页面的第一段。不幸的是,我的维基百科使用了一个奇怪的系统来处理特殊字符 (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;
}

任何帮助将不胜感激。

【问题讨论】:

  • 为什么不使用 JSON 解析器?!
  • 无论如何,我仍然需要解析 html 标签,这是我认为我的问题所在
  • 我怀疑 ? 不是真正的问号,但它们是您的终端无法显示的字符(因此它显示了问号)。
  • 不是这样 - 我将这些字符串放入数据库中,它们仍然显示与终端中相同。字符串格式/损坏可能是一个更大的问题,但我指定的是 utf8,所以它应该没有问题。
  • “它们仍然显示与终端相同” - 您是否在终端中显示数据库内容?

标签: java json parsing


【解决方案1】:

使用 JSON 解析器并通过 JSoup 之类的方式运行要清理的结果。当然,您可以编写自己的脆弱的 HTML 解析器,但这有点愚蠢。 HTML 是微妙的,而且很快就会被激怒。花点时间构建逻辑,让实用程序类来做些蹩脚的事情。

而且,是的。 cmets是正确的。这个 JSON 中有 Unicode 序列,至少当我查看那个 URL 时,它在大多数终端中都不会正确呈现。

编辑

JSON 格式(显然)可能会发生变化。通过在 URL 中指定“&continue=”以返回旧的延续格式,我得到了更清晰的输出。您可能应该了解这些延续格式更改对您意味着什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多