2017-01-02 49 views
0

我最近试图与JSoup一起解析HTML文档,我经历了JSoup的过程,发现select-Method可能是我正在寻找的东西。JSoup选择标签递归搜索

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

因此,我检查了网页,看看哪些类和ID正在使用,然后我试图将其整合到一个小的代码片段。在这个例子中我发现follwing元件:

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

不幸的是,我不能得到我期待的元素。 交易总是大小为0.我试图修改我的选择只有一部分类,我添加了id属性等。不过,我没有得到这些元素(在这种情况下,这些元素嵌套到其他元素中)。如果我尝试在DOM层次结构中位于此元素之上的元素(例如,具有类“a-section a-spacing-none slotContainer”的div),则可以找到该元素。

我是不是真的需要指定整个DOM的层次结构(在我的选择表达式中使用“>”?我希望能够定义一个选择器和JSoup会斯格特和搜索整个DOM树。

+0

如果您的问题得到了充分解答,您应该考虑接受最佳答案,从而将此问题标记为已解决。如果您需要进一步的帮助,请详细说明您需要帮助的内容。 – luksch

回答

0

不,你不必指定完整的DOM层次结构,如果元素真的是DOM的一部分,你的测试应该可以工作,我怀疑它们可能不是DOM的一部分,因为它被加载为JSoup,原因可能是我,内部DOM节点是通过AJAX通过JavaScript填充的,JSoup不运行JavaScript,所以动态加载的DOM部分是不可访问的。为了实现你想要的,你可以直接查看AJAX调用并分析它们,或者移动到另一个像selenium webdriver这样的解决方案,该解决方案运行真正的浏览器,其中包括一项工作JavaScript引擎。

+0

是的,你是对的,这是因为JS/AJAX。感谢将我重定向到硒webdriver,我会尝试。 –