我们需要从当天的国家地理照片中拍摄一张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>
答案 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();
}
}
只需将网址应用到您当前的代码即可。
方法readAll
和readJsonFromUrl
来自this回答。
修改强>
要获得其他尺寸,请使用:
String url = article.getString("url") + article.getJSONObject("sizes").getString("2048");
2048
可以替换为240,320,500,640,800,1024和1600.
不确定尺寸是否每天都在变化,但如果是这样,请检查JSON以查看哪些尺寸可用。