没有特定属性的Jsoup不匹配标签?

时间:2014-06-23 13:07:58

标签: java jquery html jquery-selectors jsoup

我有一个函数,给定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]

1 个答案:

答案 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标记。

相关问题