基于自定义属性的JSoup抓取

时间:2019-09-24 17:50:28

标签: java jsoup scrape

因此,我正在使用JSoup抓取一个网站,该网站创建了一堆具有动态类名称的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...

我尝试了多种方法来选择这些div并将其保存在元素中,但是我似乎无法正确地做到这一点。我已经尝试过按属性:

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

我已经在课堂上尝试过

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);
                }
            }
        }

这些都不起作用。我可以选择获取所有HTML的文档,但是myEls对象始终为空。我可以用来选择这些元素吗?

1 个答案:

答案 0 :(得分:1)

您确定这些元素存在于服务器返回的HTML中吗?以后可以通过JavaScript添加它们。如果页面演示中涉及JavaScript,那么您将无法使用Jsoup。我在以下类似问题的答案中提供了更多详细信息:JSoup: Difficulty extracting a single element

还有另外一个技巧。除了使用for-for-if结构之外,您还可以使用以下方法:

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