【问题标题】:Jsoup not matching tags without certain attributes?Jsoup 不匹配没有某些属性的标签?
【发布时间】:2014-06-23 13:07:58
【问题描述】:

我有一个函数,给定一个 div 元素,它会在其中找到所有 img 元素。 唯一的问题是只选择了前 3 个。前 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>

我不应该得到所有图像而不考虑属性吗?

我已经使用来自网站和本地主机的相同 HTML 结构测试了代码。该代码在 locahost 上有效,但在网站 (www.dhgate.com) 上无效

已解决 - 该站点使用了延迟加载插件,因此检查器中的 HTML 与 Jsoup 的读取方式不同。就我而言,我必须包含具有 [class~=lazyload]

的“a”标签

【问题讨论】:

  • 请发布更完整的源 HTML 示例。另外,你怎么打电话给getImagesSrc()?也请提供调用方法。
  • 理想情况下,这段代码应该打印所有带有 src 属性的 img 标签,并将 src 存储在 src 数组中,但这取决于您作为参数传递给函数的元素。可能是缺少 img 标签的特定元素。
  • 我已经对传递给函数的内容进行了双重和三重检查,它与上面的示例元素完全相同
  • @MCL 我正在从我的代码主体中调用该函数,该函数会抓取其他元素(并且一切正常)。还应该说函数以前不是函数,我把它改写成函数来整理自己的代码。但无论哪种情况,我得到的结果都是一样的。
  • 您可以编辑您的问题并提供我询问的其他信息,无需在评论中回答。

标签: java jquery html jquery-selectors jsoup


【解决方案1】:

该程序确实获得了具有类 prolist 的 div 元素内所有 img 标签的来源。但是您应该考虑到根据您的完整程序可能发生的一些问题。

for (Element e : elements) {
    String img[] = getImagesSrc(e, 1);
}

在第一个循环中,每次迭代都会覆盖 img 数组。因此,如果您有多个具有类 prolist 的 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 标签。

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2016-07-07
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多