【发布时间】: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,所以它应该没有问题。
-
“它们仍然显示与终端相同” - 您是否在终端中显示数据库内容?