当前位置: 首页 > 知识库问答 >
问题:

JSoup选择标记递归搜索

子车睿
2023-03-14

我最近尝试使用JSoup来解析HTML文档,我在JSoup上做了一遍turrorious,发现select-Method可能就是我要找的。

我试图完成的是找到html文档中拥有某个类的所有元素。为了测试这一点,我在amazon的网页上尝试了这一点(想法:找到所有有特定优惠的交易)。

因此,我检查了web页面,看看正在使用哪些类和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());
                }
            }

不幸的是,我无法得到我正在寻找的元素。deals的大小始终为0。我试着修改我的select仅用部分类,我添加了id-attribute,等等。然而,我没有得到这些元素(在本例中,这些元素嵌套到其他元素中)。如果我尝试DOM层次结构中位于该元素之上的元素(例如,类为“a-section a-spacing-none slotcontainer”的div),则会找到该元素。

我实际上需要指定整个DOM层次结构吗(通过在我的select表达式中使用“>”)?我希望能够定义一个选择器,JSoup将遍历和搜索整个DOM树。

共有1个答案

朱梓
2023-03-14

不,您不必指定完整的DOM层次结构。如果元素确实是DOM的一部分,那么您的测试应该可以工作。我怀疑它们可能不是DOM的一部分,因为DOM加载的是JSOUP。原因可能是内部DOM节点是由JavaScript通过Ajax填充的。JSoup不运行JavaScript,因此DOM的动态加载部分不可访问。为了实现您想要的,您可以直接查看AJAX调用并对其进行分析,或者继续使用另一种解决方案,如selenium webdriver,它运行一个包含工作JavaScript引擎的真正浏览器。

 类似资料:
  • 我想提取一个文本后,每个标签使用jSoup。有什么方法可以直接选择它,还是我必须执行。

  • 问题内容: 我具有以下表结构: 因此,每个论坛帖子都有一个父母,也有一个父母(根帖子除外),等等。我需要的是获取一个论坛帖子所拥有的孩子总数,包括他的孩子的孩子,孙子的孩子等等。 现在,我有一个简单的选择返回直接子代: 我什至不确定这是否可以通过sql来实现,但是我是SQL的入门者,因此我认为也许有人可以提出一些想法。 任何帮助表示赞赏。谢谢。 问题答案: 这应该做到这一点: 您可以通过修改条件来

  • 问题内容: 我看到了这个答案,我希望他是不对的,就像有人不正确地告诉主键在一个列上,而我不能在多个列上设置它一样。 这是我的桌子 我想选择用户ID 2并递归,以便获得其所有直接子对象和间接子对象(即ID 4和5)。 如何以这种方式工作?我在postgresql和sqlserver中看到了递归。 问题答案: 看起来很麻烦,但是要使用它, (或您要在层次树中查找的任何密钥ID)。 前提是从您正在使用的

  • JSoup在这里。我有以下我试图解析的超文本标记语言: 不幸的是,它的格式有点不正确(在

  • 我想在每个文本之后使用jsoup提取一个文本。有没有办法选择它? 示例代码如下: 当它完成时,它会创建自动id示例id=123

  • 问题内容: 这是情况。我有两个表: 用户(网站的注册用户), 消息(彼此之间发送的个人消息) 消息表具有以下列(仅是重要的列): ID, 发件人(发送消息的用户的ID), 发送消息的用户的接收者ID), reply_to(此消息要回复到的消息的ID,可以为NULL) 我需要做的是构造一个SELECT查询,该查询将选择2个用户之间的完整对话。即,如果用户A回复了从用户B发送的消息,而用户B回复了该消