【问题标题】:Select every text node in a HTML document except script nodes with XPath选择 HTML 文档中的每个文本节点,除了带有 XPath 的脚本节点
【发布时间】:2015-02-05 10:10:27
【问题描述】:

我目前正在用 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 标签?提前致谢。

【问题讨论】:

    标签: python-2.7 xpath scrapy


    【解决方案1】:

    试试

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

    【讨论】:

      【解决方案2】:

      这个 xPath 做你想做的事。

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

      所以我们要查看什么是文本的父级。

      更有趣的示例。我可以将它用于包含 html 代码的每个元素。

      .//text()[not(ancestor::script|ancestor::style|ancestor::noscript)]
      

      【讨论】:

      • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
      • 我使用 xpath 轴。文本是节点,我检查该节点的父节点。如果不是脚本,我会收到此文本。
      猜你喜欢
      • 2016-09-06
      • 2014-10-10
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多