如何查找所有子节点的文本

时间:2012-05-07 06:06:58

标签: java xpath webdriver htmlunit

我正在使用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!");
              }
           }
    }

但是没能找到匹配。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

尝试使用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);