遇到无法转换为字符串的文本节点问题。 我正在尝试抓取一个网站并从中获取某些信息,当我使用 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 ";
一切都准备好了,对吧?错误的!发生的情况是您删除了强元素,但删除的句子元素分隔了两个文本节点。一个用于第一个句子,一个用于最后一个单词的第一个单词。相反,你现在实际上拥有了这个:
<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
我使用了
nodeValue
,它对我来说非常有用。如果您的节点名称是摘要,那么它将是:
nodeString = 摘要.nodeValue