我无法将textNode转换为字符串。 我正在尝试抓取一个网站并从中获取某些信息,当我使用XPath查找此文本时,我得到了一个textNode。 当我在chrome中查看google开发工具时,我可以看到textNode本身包含我之后的文本,但是如何将textNode转换为纯文本?
这是我使用的代码行:
abstracts = ZU.xpath(doc, '//*[@id="abstract"]/div/div/par/text()');
我曾尝试使用像.innerHTML,toString,textContent这样的东西,但到目前为止还没有任何工作。
答案 0 :(得分:2)
如果我想查看textNode的内容字符串,我通常使用Text.wholeText,因为textNode是一个对象,因此使用toString或innerHTML将无法工作,因为它不是字符串本身的对象...
来自https://developer.mozilla.org/en-US/docs/Web/API/Text/wholeText 的示例
Text.wholeText只读属性返回逻辑上与节点相邻的所有Text节点的全文。文本按文档顺序连接。这允许指定任何文本节点并将所有相邻文本作为单个字符串获取。
<强>语法强>
str = textnode.wholeText;
备注和示例: 假设您的网页中有以下简单段落(在此处添加了一些空白以帮助格式化整个代码示例),其DOM节点存储在变量para:
<p>Thru-hiking is great! <strong>No insipid election coverage!</strong>
However, <a href="http://en.wikipedia.org/wiki/Absentee_ballot">casting a
ballot</a> is tricky.</p>
你决定不喜欢中间句子,所以你删除它:
para.removeChild(para.childNodes[1]);
后来,你决定改写一些事情,“徒步旅行很棒,但投票很棘手。”同时保留了超链接。所以你试试这个:
para.firstChild.data = "Thru-hiking is great, but ";
一切都准备好吧?错误!发生了什么事情你删除了强元素,但删除的句子的元素分隔了两个文本节点。一个用于第一个句子,一个用于最后一个用语。相反,你现在实际上有这个:
<p>Thru-hiking is great, but However, <a
href="http://en.wikipedia.org/wiki/Absentee_ballot">casting a
ballot</a> is tricky.</p>
您真的更喜欢将所有相邻的文本节点视为单个节点。这就是wholeText的用武之地:如果你有多个相邻的文本节点,你可以使用wholeText访问所有这些节点的内容。让我们假装你从未犯过最后一个错误。在这种情况下,我们有:
assert(para.firstChild.wholeText == "Thru-hiking is great! However, ");
wholeText 只是文本节点的一个属性,它返回组成所有相邻(即没有被元素边界分隔)文本节点组合的数据字符串。
现在让我们回到原来的问题。我们想要的是能够用新文本替换整个文本。这就是replaceWholeText()的用武之地:
para.firstChild.replaceWholeText("Thru-hiking is great, but ");
我们删除了每个相邻的文本节点(构成整个文本的所有节点),但是调用了replaceWholeText()的节点,我们将剩下的一个更改为新文本。我们现在拥有的是:
<p>Thru-hiking is great, but <a
href="http://en.wikipedia.org/wiki/Absentee_ballot">casting a
ballot</a> is tricky.</p>
使用Node.textContent或长期的Element.innerHTML可以更好地满足全文功能的一些用途;这很好,在大多数情况下可能更清晰。如果必须使用元素中的混合内容,如此处所示,则wholeText和replaceWholeText()可能很有用。
更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Text/wholeText