使用Selenium并尝试使用正确的xpath从pre标签中获取文本。
WebElement sequence = driver.findElement(By.xpath("//span[@id='MFE_sequence_span']/pre"));
WebElement structure = driver.findElement(By.xpath("//span[@id='MFE_structure_span']/pre"));
if(sequence.isDisplayed()) {
System.out.println("sequence: " + sequence.getText());
System.out.println("structure: " + structure.getText());
break;
}
所以我已经进行了一些测试,它对其他标签起作用很简单,当最后一次" / pre"不存在,但是当我添加" / pre"我无法找到节点异常。到底发生了什么事?
这是html。真的很简单。是的,还有更多;这是嵌入式的,但它是唯一相关的部分。
<span id="MFE_sequence_span">
<pre>
1 AAAAA
</pre>
</span>
答案 0 :(得分:0)
不要担心标签。只需使用xpath
基于文本的搜索即可找到它。我总是发现在找到元素时跳过了很多问题。使用explicit
等待,因为它是一个独立于标签的搜索,可能会进行较慢的搜索。
By byXpath = By.xpath("//*[.='1 AAAAA']");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(byXpath ));
修改
我可以建议的另一件事是使用JavaScript
//Just to make sure the previous tag is present
By byId = By.id("MFE_sequence_spa");
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(byId));
WebElement myDynamicElement = (WebElement)((JavascriptExecutor)driver).executeScript("return document.querySelector('#MFE_sequence_span>pre');");
System.out.println(myDynamicElement.getText());
打印
1 AAAAA
答案 1 :(得分:0)
这可能是一个很长的镜头,但尝试用div替换跨度。
这是因为根据HTML规范,内联元素只能包含其他内联元素。由于span是内联的,pre是block,因此span内的pre是无效的HTML。
答案 2 :(得分:0)
好的,所以经过对我得到的来源的进一步分析后,brunobastosg是完全正确的。所有来源除了跨度内部的预标记已由网络驱动程序获取。但是,pre标签显然位于浏览器的页面源上。因此,我假设Selenium在我处理它之前正在“纠正”坏的html,从而造成了这种巨大的烦恼。
我将假设这是一个Selenium的东西并通过其他libs查看。好的部分是Selenium仍然有用,无论如何还有许多其他原因。我可能需要使用另一个库进行实际的html处理,其中至少有一些我可以查看。如果我能找到一个解决方案,我会回到这里。
修改强>
Saifur在他的编辑中得到了它。问题已解决。