如何在android中使用jsoup获取当天的国家地理照片

时间:2017-01-21 18:53:27

标签: android jsoup photo

我们需要从当天的国家地理照片中拍摄一张Android项目的照片。我们正在使用jsoup来做它,它适用于我们试图获得的其他网站和照片,但不适用于此。 http://www.nationalgeographic.com/photography/photo-of-the-day

这是我们需要获得的照片的链接。如果您检查页面,您将看到包含链接的元素具有不同大小的照片的多个链接。所以我们怀疑这是问题所在。这是包含所有链接的元素:

 Document doc = Jsoup.connect("http://www.nationalgeographic.com/photography/photo-of-the-day").get();
            Elements img = doc.select("div.modules-images__placeholder source[srcset]");

            imgSrc = img.attr("srcset"); //srcset

            String[] splitStr = imgSrc.split("\\s+");
            int n = splitStr.length;
            imgSrc = splitStr[n-2];

            //Download Image from URL
            InputStream input = new java.net.URL(imgSrc).openStream();
            //Decode Bitmap
            bitmap = BitmapFactory.decodeStream(input);
            myWallpaperManager.setBitmap(bitmap);

正如您所看到的,有多个链接,因此我们也尝试拆分代码并只获取其中一个,但jsoup似乎并没有获得任何代码。 这是代码:

<ui-select multiple ng-model="ctrl.multipleDemo.colors" theme="bootstrap" ng-disabled="ctrl.disabled" close-on-select="false" style="width: 300px;" title="Choose a color">
<ui-select-match placeholder="Select colors...">{{$item}}</ui-select-match>
<ui-select-choices repeat="color in ctrl.availableColors | filter:$select.search">
  {{color}}
</ui-select-choices>

2 个答案:

答案 0 :(得分:0)

我已经找到了解决方案。 此外,如果您想获得不同的尺寸,只需将0更改为另一个索引,它就会起作用:

String imgSrc = img.attr("srcset").split(",")[0].replaceAll(" \\d+w", "");

目前正在返回http://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDq-TNIRQ3qELJppd8ZLNRvnhakVub3VQlC2V5_yAGtyNoIAtaUObf5sBn_PGVEIlVVcerfj6l1ovYy2W4h7lMAkEVLdiCZKr9S9wuwge1myLnbvmEvxjeQ-HOfdmgprhGjqn4pNtAwmKvwU6FOW3O0jR-t4LlattRw52wBmvg/

修改 如果您可以正确获取srcset属性,它可以工作。出于某种原因,Jsoup没有得到它。

答案 1 :(得分:0)

我的另一个答案没有用,因为Jsoup没有得到整个页面。我找到了该文章的JSON网址,因此我制作了一个简单的代码来获取该网址:

    try {
        JSONObject jobject = readJsonFromUrl(
                "http://www.nationalgeographic.com/photography/photo-of-the-day/_jcr_content/.gallery.json");
        JSONObject article = jobject.getJSONArray("items").getJSONObject(0);
        String url = article.getString("url") + article.getString("originalUrl");
        System.out.println(url);
    } catch (Exception e) {
        e.printStackTrace();
    }

您需要将此方法添加到任何类:

private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
        sb.append((char) cp);
    }
    return sb.toString();
}

public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
        BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
        String jsonText = readAll(rd);
        JSONObject json = new JSONObject(jsonText);
        return json;
    } finally {
        is.close();
    }
}

只需将网址应用到您当前的代码即可。

方法readAllreadJsonFromUrl来自this回答。

修改

要获得其他尺寸,请使用:

String url = article.getString("url") + article.getJSONObject("sizes").getString("2048");

2048可以替换为240,320,500,640,800,1024和1600.

不确定尺寸是否每天都在变化,但如果是这样,请检查JSON以查看哪些尺寸可用。