Select HTML 文档中的每个文本节点,除了带有 XPath 的脚本节点

Select every text node in a HTML document except script nodes with XPath

我目前正在用 Scrapy 编写一个网络爬虫,我想用一个 XPath 查询获取每个 HTML 文档屏幕上显示的所有文本。

这是我正在使用的HTML:

<body>
  <div>
    <h1>Main title</h1>
    <div>
      <script>var grandson;</script>
      <p>Paragraph</p>
    </div>
  </div>
  <script>var child;</script>
</body>

如您所见,在 body 标签

中获取文本时,我想过滤一些 script 标签

这是我的第一个 XPath 查询及其结果:

XPath: /body/*//text()
Result: Main title / var grandson; / Paragraph / var child;

这不好,因为它还会获取 script 标签内的文本。

这是我的第二次尝试:

XPath: /body/*[not(self::script)]//text()
Result: Main title / var grandson; / Paragraph

这里过滤了最后一个 script 标签(body 的子标签),但内部 script 没有。

您将如何过滤所有 script 标签?提前致谢。

尝试

//*[not(self::script)]/text()

这个 xPath 可以满足您的需求。

.//text()[not(parent::script)]

所以我们在寻找文本的父级。

更有趣的示例。我可以将它用于包含 html code.

的每个元素
.//text()[not(ancestor::script|ancestor::style|ancestor::noscript)]