2012-05-07 40 views
1

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

但这无法找到匹配。

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

回答

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 /硒很长一段时间,但我见过这样的事情,看起来像它可能有同样的效果

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

好的,我会试试这个。但我希望使用普通的webdriver API来减轻重量。 – rsj

+0

这里的问题是,如果链接包含魔术字符串,我想单击它,并且href目标可能是javascript。但我会检查jsoup。 – rsj

+1

很长一段时间没有使用WebDriver/Selenium,但我已经看到类似这样的东西,它看起来可能具有相同的效果,但是这并未经过测试,并且是一种疯狂的猜测:'String innerText =((JavascriptExecutor)驱动程序) .executeScript(“return arguments [0] .innerText”,element);' –

2

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

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

这将选择XML文档中的所有a有一个span的孩子,有一个文本节点的后裔,其字符串值是字符串"magic"

+0

没错,但我不知道是否有或者没有跨度的孩子,或者有多少跨度的孩子。再次,我正在测试任意网站。我想递归地寻找所有的孩子并获得他们的文本。 – rsj

+2

那么这个“魔术”这个词有什么关系呢?你一定需要编辑你的问题,并提供更好的源XML和更好的解释。 –

+0

问题很好,只需要从头到尾阅读。我说我不知道​​是否会有跨度,我甚至举例说明了我期望遇到的格式类型。您提出的答案在问题中提供的示例上失败。 – rsj

相关问题