JSoup选择标记递归搜索

时间:2017-01-02 11:02:43

标签: html dom jsoup

我最近尝试使用JSoup解析HTML文档,我浏览了JSoup上的文章,发现select-Method可能就是我想要的。

我试图完成的是找到拥有某个类的html文档中的所有元素。为了测试这一点,我尝试使用亚马逊网页(想法:找到某些优惠的所有优惠)。

所以我检查了网页,看看正在使用哪些类和ID,然后我尝试将其集成到一个小代码片段中。在这个例子中,我发现了以下元素:

<span id="dealTitle" class="a-size-base a-color-link dealTitleTwoLine restVisible singleCellTitle autoHeight">PROCAVE Matratzen-Brücke aus Schaumstoff 25 x 200 cm für ...</span>

此元素嵌入在其他元素中并且存在多次(当然每个交易)。所以这是我的代码来阅读交易元素:

 Document doc = Jsoup.connect("https://www.amazon.de/gp/angebote/ref=gbph_ftr_s-8_cd61_page_1?gb_f_LD=dealStates:AVAILABLE%252CWAITLIST%252CWAITLISTFULL%252CUPCOMING,dealTypes:LIGHTNING_DEAL,page:1,sortOrder:BY_SCORE,dealsPerPage:8&pf_rd_p=425ddcb8-bed4-4e85-ac0f-c1a79d14cd61&pf_rd_s=slot-8&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A3JWKAKR8XB7XF&pf_rd_r=BTHRY008J9N3N5CCMNEN&gb_f_second=dealStates:AVAILABLE%252CWAITLIST%252CWAITLISTFULL,dealTypes:COUPON_DEAL,page:8,sortOrder:BY_SCORE,dealsPerPage:8").timeout(0).get();

            Elements deals = doc.select("span.a-size-base.a-color-link.dealTitleTwoLine.restVisible.singleCellTitle.autoHeight");

            for (Element deal : deals) {
                if (deal.text().contains("ItemMatch")) {
                    System.out.println("Found deal: " + deal.text());
                }
            }

不幸的是我无法得到我想要的元素。 deal 总是大小为0.我试图仅使用部分类修改我的选择,我添加了id-attribute等等。然而,我没有获得元素(在这种情况下,这些元素嵌套在其他元素中)。如果我尝试在DOM层次结构中位于此元素之上的元素(例如,带有类“a-section a-spacing-none slotContainer”的div),则会找到它。

我是否真的需要指定整个DOM层次结构(在我的选择表达式中使用“&gt;”?我希望能够定义一个选择器,JSoup将遍历并搜索整个DOM树。

1 个答案:

答案 0 :(得分:0)

不,您不必指定完整的DOM层次结构。如果元素实际上是DOM的一部分,那么您的测试应该有效。我怀疑它们可能不是DOM的一部分,因为它被加载为JSoup。原因可能是,内部DOM节点由JavaScript通过AJAX填充。 JSoup不运行JavaScript,因此无法访问DOM的动态加载部分。要实现您想要的功能,您可以直接查看AJAX调用并分析它们,或者转到另一个解决方案,如selenium webdriver,它运行一个真正的浏览器,包括一个可用的JavaScript引擎。