我有一个函数,给定div元素,将找到其中的所有img元素。 唯一的问题是只选择了前3个。前三个和其余的唯一区别是包含属性(class和alt)
Document doc = Jsoup.connect("http://www.dhgate.com/wholesale/kitchen-fixtures/c019034002-1.html").get();
Elements elements = doc.select("div.prolist");
for (Element e : elements) {
String img[] = getImagesSrc(e, 1);
}
....
protected String[] getImagesSrc(Element e, int numOfImages) {
String src[];
src = new String[numOfImages];
int i = 0;
Elements imgElements = e.select("img[src]");
for (Element o : imgElements) {
System.out.println("html = " + o.outerHtml());
src[i++] = o.attr("src");
}
return src;
}
一些示例div元素(这些是传递给函数的内容)
<div class="prolist">
<a href="some link"><img class="folder" alt="Folder" src="folder.jpg"/></a>
</div>
<div...
...div>
<div class="prolist">
<a href="some link"><img src="folder.jpg"/></a>
</div>
不管有什么属性,我都不应该得到所有图像吗?
我使用来自网站和localhost的相同HTML结构测试了代码。该代码适用于locahost,但不适用于网站(www.dhgate.com)
已解决 - 该网站使用的是lazyload插件,因此检查器中的HTML与Jsoup的内容不同。在我的情况下,我必须包含'a'标签,其中[class~ = lazyload]
答案 0 :(得分:0)
该程序确实获得了带有类扩展的div元素中所有img标记的来源。但是你应该考虑一些可能发生的问题,这取决于你完整的程序。
for (Element e : elements) {
String img[] = getImagesSrc(e, 1);
}
在第一个循环中,每次迭代都会覆盖img数组。因此,如果您有多个带有类扩展的div元素,则每个元素的img标记数组将覆盖另一个。如果您想获取整个img或所有div标记,请将getImagesSrc()
方法参数更改为Elements
并直接传递doc.select("div.prolist")
。
getImagesSrc()
方法的第二个参数用于初始化数组。因此,如果我们有多个img标记,它将导致ArrayOutOfBoundException。图像标签的数量是不确定的。所以在这种情况下你应该使用List
。如果你想要一个数组,你可以稍后从列表中创建一个数组。例如
protected String[] getImagesSrc(Element e) {
List<String> imgSources = new ArrayList<String>();
Elements imgElements = e.select("img[src]");
for (Element o : imgElements) {
imgSources.add(o.attr("src"));
}
return imgSources.toArray(new String[imgSources.size()]);
}
另请注意,由于您选择了e.select("img[src]");
之类的img,因此它只会返回具有src属性的img标记。