将textNode内容转换为字符串

问题描述 投票:0回答:2

遇到无法转换为字符串的文本节点问题。 我正在尝试抓取一个网站并从中获取某些信息,当我使用 XPath 查找此文本时,我会返回一个 textNode。 当我在 chrome 中查看 google 开发工具时,我可以看到 textNode 本身包含我想要的文本,但是如何将 textNode 转换为纯文本?

这是我使用的代码行:

abstracts = ZU.xpath(doc, '//*[@id="abstract"]/div/div/par/text()');

我尝试过使用 .innerHTML、toString、textContent 之类的东西,但到目前为止没有任何效果。

javascript xpath textnode
2个回答
3
投票

如果我想查看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


0
投票

我使用了

nodeValue
,它对我来说非常有用。如果您的节点名称是摘要,那么它将是:

nodeString = 摘要.nodeValue

© www.soinside.com 2019 - 2024. All rights reserved.