【问题标题】:Stack missing calls in recursion Java在递归Java中堆栈丢失的调用
【发布时间】:2017-09-14 09:24:13
【问题描述】:

我正在使用 Jsoup 解析器并希望进行一些递归调用以查找与我的关键字匹配的所有标签。 问题是堆栈调用在没有找到孩子时以第一个标签结束(第一个 if 测试)并且没有完成其余的关闭调用。

    public Set<Element> deepSearch(Element node,String keyword)
{
    Pattern  searchKeyPattern= Pattern.compile(keyword);
    Set<Element> matchedTags = new HashSet<Element>();
    System.out.println("Node name = " + node.tagName()+" || Node children = " + node.children().size());
    if(searchKeyPattern.matcher(node.ownText()).find())
    {
        matchedTags.add(node);
        System.out.println("matched");
    }
    if(node.childNodeSize()==0)
    {
        System.out.println("No children found");
        return matchedTags;
    }
    else
    {
        System.out.println("else the recursive nested call");
        return deepSearch(node.children().iterator().next(),keyword);
    }
}

这是控制台打印的结果:

节点名称 = html || Node children = 2 else 递归嵌套调用 节点名称 = 头部 || Node children = 10 否则递归嵌套调用 节点名称 = 元 ||子节点 = 0 未找到子节点

我用来测试的这个网址是link

是我的电话有问题,还是我错过了什么?!

【问题讨论】:

    标签: java search recursion stack jsoup


    【解决方案1】:

    该方法失败的原因是您每次迭代到下一次出现时都在 Element 上使用 children() 方法。您在每次调用中都会深入 1 级,当您从 html > head > meta 进入 meta 标签时,没有子标签,因此您的代码会失败。由于我编写了一些依赖于 Jsoup 的网络爬虫,因此请随时给我发送消息以帮助您编写代码。

    IMO,您查找电话号码的方式过于复杂。只需解析文档并获取 ID 为“result”的元素,因为这是存储要提取的电话号码的 ol(有序列表)。使用 .text() 方法,你会得到你想要的。

    【讨论】:

    • 感谢 Alex 的回复,正如您所说的,我认为问题出在迭代器上,我用 for 循环对其进行了更改,并且知道它会返回更多标签。电话号码只是测试,我是寻找带有特定关键字的标签,而不是电话号码..
    • 如果答案是正确的,您应该标记它以防止进一步的回复等。
    猜你喜欢
    • 2020-12-17
    • 2014-02-14
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2015-12-17
    • 2018-05-16
    • 2017-09-27
    • 2016-12-30
    相关资源
    最近更新 更多