基于自定义属性的 JSoup 抓取

JSoup Scraping based on custom attributes

所以我正在使用 JSoup 抓取一个网站,该网站创建了一堆具有动态 class 名称的 div(它们每次重新加载都会更改),但属性名称相同。例如:

<div class="[random text here that changes] js_resultTile" data-listing-number="[some number]">
    <div class="a12_regularTile js_rollover_container " itemscope itemtype="http://schema.org/Product" data-listing-number="[same number here]">
        <a href...

我已经尝试了多种方法来 selecting 这些 div 并将它们保存在元素中,但我似乎无法正确处理。我试过属性:

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = doc.select("div[data-listing-number]");

我试过 class:

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = doc.getElementsByClass("a12_regularTile")

并且:

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = doc.select("div[class*=js_resultTile]")

我试过另一种属性方法:

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = new Elements();
for (Element element : doc.getAllElements() )
        {
            for ( Attribute attribute : element.attributes() )
            {
                if ( attribute.getKey().equalsIgnoreCase("data-listing-number"))
                {
                    myEls.add(element);
                }
            }
        }

None 这些作品。我可以 select 获取所有 HTML 的文档,但我的 myEls 对象始终为空。我可以用什么来 select 这些元素?

您确定服务器返回的 HTML 中存在这些元素吗? JavaScript 稍后可能会添加它们。如果 JavaScript 涉及到页面呈现,那么您将无法使用 Jsoup。我在此处对类似问题的回答中有更多详细信息:

还有一个提示。除了使用 for-for-if 结构,您还可以使用这个:

    for (Element element : doc.getAllElements()) {
        if (element.dataset().containsKey("listing-number")) {
            myEls.add(element);
        }
    }