我已经有好几天的问题,并且一直在搜索StackOverflow和Google的答案。这是Firefox扩展中的代码,我在网页上引用标签/文本。我试图从<b></b>
标签的中间获取文本。测试深入到文档中,所以我想我可以使用xpath来引用它。我一直在尝试使用document.evaluate函数来引用它而没有运气。以下是我最近尝试过的代码段:
var result = document.evaluate( '//*[@id="page"]/table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b', document, null, XPathResult.STRING_TYPE, null );
alert( 'Value: ' + result.stringvalue );
我是DOM和xpath的新手,所以请告诉我这是否至少在正确的轨道上。我也尝试过其他方法但收效甚微。我试图解决这个问题的HTML代码如下所示:
.
. Rest of the source
.
<b>This is title number 8955592</b>
.
.
我从chrome检查元素功能获得了xpath。我也尝试使用萤火虫来看看那里的东西是否也有帮助。
Xpath:
//*[@id="page"]/table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b
CSSPath:
#page > table:nth-child(3) > tbody > tr > td:nth-child(3) > table:nth-child(3) > tbody > tr:nth-child(9) > td:nth-child(2) > b
我的希望是我的xpath字符串中有一个简单的格式错误,我刚刚开始字符串错误。同样的问题迫使我停止了我正在研究的另一个项目,所以我决定这次尝试实际解决它。我必须重新强制执行这是我正在进行的firefox扩展的一部分。我也将节点作为一种方法来实现这一点,但这种方法变得非常复杂。非常感谢任何帮助。
答案 0 :(得分:2)
首先,你有
result.stringvalue
应该是
result.stringValue
(资本V)。但是,这应该抛出错误。我假设您已检查控制台是否有错误?
如果没有看到您尝试从中提取数据的页面,很难说出现了什么问题。但你可以把它缩小如下:
var result = document.evaluate(
'//*[@id="page"]', // /table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b',
document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
我所做的只是获取XPath表达式的第一部分,并暂时注释掉其余部分。我还询问了节点结果类型。然后查看返回的节点数:
console.log(result.snapshotLength); // or alert() if you prefer
如果//*[@id="page"]
表达式产生1个或更多结果,则扩展表达式并再试一次:
var result = document.evaluate(
'//*[@id="page"]/table[3]', // /tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b',
document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
再次检查result.snapshotLength。 当snapshotLength为零时,那就是XPath失败的地方。这应该可以帮助你找出原因。但如果你无法弄清楚原因,请告诉我们这些结果,我们会看看我们是否可以提供帮助。
答案 1 :(得分:1)
感谢大家的帮助。我终于想通了,我为迟到的回应道歉。我拼错了stringValue但是我没有最终使用这个属性。我能够在这方面取得进展并根据所提供的建议弄清楚。我最初得到一个未定义的结果。当我从末尾取下.stringValue时,结果是一个 XPathResult 对象。我后来确定你可以在 XPathResult 对象上执行.singleNodeValue并获取你正在尝试使用的实际 HTMLElement 对象。以下是我最终解决此问题的最终结果:
document.evaluate( '//*[@id="page"]/table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue.innerHTML;
从页面返回<b>text</b>
的内容。虽然这可能看起来像是获得这个结果的繁琐方式,但弄清楚这一点基本上教会了我这些对象是如何工作的,当我第一次提出这个问题时我并不理解。使用系统的方法来跟踪我是否在正确的道路上(按照建议)是非常有帮助的。再次,非常感谢你的帮助。