我无法将textNode转换为字符串时遇到问题。
我正在尝试抓取一个网站并从中获取某些信息,当我使用XPath查找此文本时,我又回来了一个textNode。
当我在Chrome浏览器中查看google开发工具时,可以确定textNode本身包含我要输入的文本,但是如何将textNode转换为纯文本?
这是我使用的代码行:
abstracts = ZU.xpath(doc, '//*[@id="abstract"]/div/div/par/text()');
我尝试使用.innerHTML,toString,textContent之类的东西,但到目前为止没有任何效果。
最佳答案
如果我想查看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 ";
都准备好了吧?错误!发生的事情是您删除了strong元素,但删除的句子元素将两个文本节点分隔开。一个用于第一个句子,一个用于最后一个词。相反,您现在实际上拥有以下功能:
<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