我尝试通过Java访问Wikiquote来获取引用。
到目前为止,我有这段代码:
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.GET, "https://en.wikiquote.org/w/api.php?format=json&action=parse&page=Ellen_DeGeneres&prop=text", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jobject) {
try {
for (int i = 0; i < jobject.names().length(); i++) {
Log.e("JSON", "key = " + jobject.names().getString(i) + " value = " + jobject.get(jobject.names().getString(i)));
}
} catch (Exception ex) {
Log.e("JSON", ex.getLocalizedMessage());
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
request.setTag(getClass().getName());
VolleySingleton.getInstance(this).addToRequestQueue(request);
这是我的logcat中的响应。所以它应该是JSON响应,但身体看起来非常HTML给我。那么如何解析这个来获取所有引用呢?
key = parse value = {“title”:“Ellen 勒斯 “ ”的pageid“:1902, ”文本“:{ ”*“:” \ n&LT; / A&GT; \ n \ n&LT; / A&GT;&LT; / DIV&GT; \ nEllen DeGeneres&lt; / div&gt; \ n&lt; / div&gt; \ n&lt; / div&gt; \ n
Ellen Lee 勒斯&LT; / A&GT;&LT; / B个(出生于1月26日&lt; / a&gt;,1958&lt; / a&gt;)是美国人 脱口秀喜剧演员,电视女主人和女演员。她出演了 流行的情景喜剧Ellen&lt; / a&gt;&lt; / i&gt;从1994年到1998年,并有 举办了她的联合电视脱口秀节目,艾伦 DeGeneres Show&lt; / a&gt;&lt; / i&gt;,自2003年以来。她与Portia de结婚 罗西&LT; / A&GT;。&LT; / p为H. \ nQuotes&LT; /跨度&GT;并[d /跨度&gt;编辑&LT; / A&GT;]&LT; /跨度&GT;&LT; /跨度&GT;&LT; / H2&GT; \ n \ n
我 想想这项工作的难点[站立] - 我的意思是,我认为这一点 部分是伟大的 - 但旅行是你知道的,因为 - 因为我 从家里走了很多,这次我出去了三个半星期 没有回家,那很难,要走了三个半星期 因为那时我得问问我的朋友,“你介意去看看吗? 房子和浇灌植物,并打开一些灯,然后制作它 看起来像某人的家,并确保移动通过婴儿床 没有纠结或婴儿会感到无聊...... \“\ n \ n 品味 这&lt; / i&gt;&lt; / li&gt; \ n&lt; / ul&gt; \ n&lt; / li&gt; \ n&lt; / ul&gt; \ n \ n 你不讨厌什么时候 人们上班迟到了。他们总是有最糟糕的借口。 \“哦, 对不起,我迟到了,交通。\“\”交通,对吧?你觉得我怎么样? 这里;直升飞机!?\“\ n \ n 这里和 现在&lt; / i&gt;&lt; / li&gt; \ n&lt; / ul&gt; \ n&lt; / li&gt; \ n&lt; / ul&gt; \ n \ n 我是 - 我是,嗯, 一个 教母就是这样,做教母很有趣,她是 所以&LT; I&GT /;珍贵,她是我生命中的光,她是两个......或者五个 或者什么,她是,呃......我不知道,我从未见过她 - 图片很珍贵,她只是看起来如此,你知道......她活得很清楚 穿过小镇,我没有那种时间,但是,嗯......好吧,我发送 金钱和东西,它不像我没有 连接.... \ n \ n 味 这&lt; / i&gt;&lt; / li&gt; \ n&lt; / ul&gt; \ n&lt; / li&gt; \ n&lt; / ul&gt; \ n \ n 我不想得到 当他们乘坐抱婴儿的飞机时,我给人们相同的外观: “这是一个可爱的宝宝,只要继续走路,继续走路,继续前进, 继续...... \“\ n \ n 味道 这&lt; / i&gt;&lt; / li&gt; \ n&lt; / ul&gt; \ n&lt; / li&gt; \ n&lt; / ul&gt; \ n \ n 如果我们不想 我们用外表来表达我自己的东西 坚持以我们的行为来判断的令人反感的选择, 通过我们的工作。\ n \ n 我的观点...而且我有一个&lt; / i&gt;。新 约克:Bantam Books,1995&lt; / li&gt; \ n&lt; / ul&gt; \ n&lt; / li&gt; \ n&lt; / ul&gt; \ n \ n
答案 0 :(得分:1)
首先,维基百科是面向HTML的,如果我们可以这么说的话,将HTML转换为JSON(修辞地:顺便说一下哪种JSON格式?)是没有意义的,所以它只返回HTML的一部分。显示在任意HTML查看器中。你在这里要做的是:
我刚刚在2017年4月5日转发了该回复,以下示例提供了一个使用普通Java和org.json以及JSoup的可能解决方案:
public static void main(final String... args)
throws IOException {
try ( final Reader reader = getPackageResourceReader(Q42938530.class, "wikiquotes.json") ) {
final JSONTokener tokener = new JSONTokener(reader);
final JSONObject jsonObject = (JSONObject) tokener.nextValue();
final String quotesHtml = extractQuotesHtml(jsonObject);
final List<String> quotes = extractQuotes(quotesHtml);
for ( final String quote : quotes ) {
System.out.println(quote);
}
}
}
private static String extractQuotesHtml(final JSONObject jsonObject) {
return jsonObject
.getJSONObject("parse")
.getJSONObject("text")
.getString("*");
}
private static List<String> extractQuotes(final String quotesHtml) {
final Document document = Jsoup.parse(quotesHtml);
final List<String> quotes = new ArrayList<>();
final Elements elements = document.select("ul > li");
for ( final Element element : elements ) {
quotes.add(element.text());
}
return quotes;
}
当然,您必须微调extractQuotes
方法以更准确地提取引号。目前上面的示例能够生成以下输出到stdout:
我觉得这项工作很难[脱口而出] - 我的意思是,我认为这部分很棒 - 但旅行是你知道的,因为 - 因为我离家很多这次我出门三个半星期没有回家,这很难,三个半星期后才会消失,因为我不得不问我的朋友,“你介意去吗?房子和浇灌植物,并打开一些灯,使它看起来像一个人的家,并确保婴儿床上的移动不纠结或婴儿会感到无聊......“品尝这个左右 品尝这个 你不讨厌人们上班迟到的时候。他们总是有最糟糕的借口。 “哦,我很抱歉,我迟到了,交通。” “交通,嗯?你觉得我怎么来到这里;直升飞机!?”这里和现在
这里和现在