【问题标题】:How to find text of all child nodes如何查找所有子节点的文本
【发布时间】:2012-05-07 06:06:57
【问题描述】:

我正在使用 webdriver 抓取网站以寻找用魔法常数装饰的链接,除了文本可能被格式化:

<a href="blah" ..><span blah>magic</span></a>

还有很多层次

<a href="blah" ..><span blah>A <span blah><b>magic</b></span> evening</span></a>

我不知道它是否被格式化,或者如果是,它有多深,因为我正在搜索任意网站。

我的代码如下所示:

List<WebDriver> links = driver.getElements(By.tagName("a"));
   for (WebElement link : links) {
       List<WebElement> children = link.getElements(By.tagName("*"));
           for (WebElement child : children) {             
              if (myPattern.matcher(child.getText()).matches()) {
                 System.out.println("found match!");
              }
           }
    }

但这无法找到匹配项。

关于如何确定是否匹配的任何想法?

【问题讨论】:

    标签: java xpath webdriver htmlunit


    【解决方案1】:

    如果您可以使用 XPath,一个有用的 XPath 表达式是

    //a[span[.//text()[. = 'magic']]]
    

    这会选择 XML 文档中的所有 a,这些 span 子节点具有文​​本节点后代,其字符串值为字符串 "magic"

    【讨论】:

    • 对,但是不知道有没有span子,也不知道有多少span子。同样,我正在测试任意站点。我想递归查找所有孩子并获取他们的文本。
    • 那么“魔法”这个词与这一切有什么关系呢?您肯定需要编辑您的问题并提供更好的源 XML 和更好的解释。
    • 这个问题很好,只是需要从头到尾阅读。我说我不知道​​是否会有跨度,我什至给出了我期望遇到的格式化类型的例子。您提出的答案在问题中提供的示例中失败。
    • @rsj:那你需要解释一下“用魔法常数装饰”是什么意思。如果我们想要一个有用的解决方案,我们最好不要在问题的定义中使用散文。
    • @rsj:如果你能准确解释你想要选择哪个元素,那么我可能会给出一个只选择这个元素的 XPath 表达式。
    【解决方案2】:

    尝试使用jsoup 来获取文本内容,然后从那里非常简单

    String html = "<a href=\"blah\"><span blah>...<b>magic</b>...</span></a>"
    String string = Jsoup.parse(html).text(); //A magic evening
    if(string.contains("magic")){ //you can optimize to have word match, e.g. not "magical"
        //it's a match
    }
    

    编辑:

    很久没用WebDriver/Selenium了,但是我看到过类似这样的东西,看起来可能有同样的效果

    String innerText = ((JavascriptExecutor)driver).executeScript("return arguments[0].innerText", element);
    

    【讨论】:

    • 好的,我会试试这个。但我希望使用普通的 webdriver API 来实现更轻的重量。
    • 这里的问题是如果链接包含魔术字符串,我想点击它,href目标可能是javascript。但我会检查 jsoup。
    • 很久没用WebDriver/Selenium了,但是我见过类似这样的东西,看起来可能有同样的效果,但这没有经过测试和一个疯狂的猜测:String innerText = ((JavascriptExecutor)driver).executeScript("return arguments[0].innerText", element);
    • 这种方法的变体有效。在 Firefox 上, textContent 可以解决问题,但在 htmlunit 上不起作用。在那里,我使用了 innerHtml,然后处理了 html 以获取文本内容。如果您将您的评论推广到某个答案,我可以选择它。
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多