所以我试图使用维基百科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;
}
非常感谢任何帮助。
答案 0 :(得分:0)
使用JSON解析器并通过JSoup之类的内容运行要清除的结果。当然,你可以编写自己的脆弱的HTML解析器,但这是一个傻瓜的差事。 HTML很微妙,很快就会生气。花时间构建你的逻辑,让实用程序类做一些蹩脚的东西。
而且,是的。评论是正确的。这个JSON中有Unicode序列,至少在我查看该URL时,大多数终端都无法正确呈现。
修改
JSON格式(显然)可能会发生变化。我通过在URL中指定“&amp; continue =”来恢复输出,以恢复较旧的延续格式。你应该知道这些延续格式变化对你意味着什么。