如何使用Java解析Wikiquotes响应?

时间:2017-03-21 21:35:22

标签: java android html json parsing

我尝试通过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
  • 1 个答案:

    答案 0 :(得分:1)

    首先,维基百科是面向HTML的,如果我们可以这么说的话,将HTML转换为JSON(修辞地:顺便说一下哪种JSON格式?)是没有意义的,所以它只返回HTML的一部分。显示在任意HTML查看器中。你在这里要做的是:

    • 进行API调用以获得格式良好的JSON响应(您正在使用Volley进行此操作)。
    • 从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:

      

    我觉得这项工作很难[脱口而出] - 我的意思是,我认为这部分很棒 - 但旅行是你知道的,因为 - 因为我离家很多这次我出门三个半星期没有回家,这很难,三个半星期后才会消失,因为我不得不问我的朋友,“你介意去吗?房子和浇灌植物,并打开一些灯,使它看起来像一个人的家,并确保婴儿床上的移动不纠结或婴儿会感到无聊......“品尝这个左右   品尝这个   你不讨厌人们上班迟到的时候。他们总是有最糟糕的借口。 “哦,我很抱歉,我迟到了,交通。” “交通,嗯?你觉得我怎么来到这里;直升飞机!?”这里和现在
      这里和现在