【问题标题】:JSoup Scraping based on custom attributes基于自定义属性的 JSoup Scraping
【发布时间】:2019-09-24 17:50:28
【问题描述】:

所以我正在使用 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 对象始终为空。我可以使用什么来选择这些元素?

【问题讨论】:

    标签: java jsoup scrape


    【解决方案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);
            }
        }
    

    【讨论】:

    • 感谢这位克里斯蒂安,我认为你是对的。我可以使用什么工具来解析涉及 Javascript 调用的网站?
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多