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)]
我目前正在用 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)]