【问题标题】:xpath expression to select and normalize-space用于选择和规范化空间的 xpath 表达式
【发布时间】:2022-07-04 10:58:57
【问题描述】:

我想编写一个将div 元素与attributedata-dmid="decimal-price-container" 匹配的XPath 表达式,然后规范化文本之间的空格。我写了一个 XPath 但不起作用,有人可以向我解释为什么它不起作用//div [contains(@data-dmid="decimal-price-container") and normalize-space(text())]

<div data-dmid="decimal-price-container" class="aci acj bt">
    <span data-dmid="price-digit" class="r t ack acl rn acm">4</span>
    <span data-dmid="price-cent" class="r t jk ack acl">95</span>
    <span data-dmid="price-currency" class="r t a jt jp acn jk">€</span>
</div>

【问题讨论】:

  • 在哪个文本之间?请显示您的预期输出。
  • @OldProgrammer 这是一个价格,我希望它是这样的 495 欧元或任何接近它的东西也可以
  • 您错过了定义“not working” ????如果我们不知道您真正想要实现什么(也许您自己也不知道?)那么我们能提供什么帮助

标签: html xml xpath xpath-2.0 xpath-1.0


【解决方案1】:

通过在谓词中包含normalize-space() 调用,您尝试选择与class 匹配的div 并具有非空白文本节点子节点。没有这样的节点。

这个 XPath,

normalize-space(/div[@data-dmid="decimal-price-container"])

将返回此字符串,

4 95 €

【讨论】:

  • 谢谢,但这个表达式不起作用,因为我正在使用它进行抓取。它是一个名为 octoparse 的屏幕抓取工具。还有其他我可以使用的 XPath 表达式吗?
  • 它使用您发布的标记与符合 XPath 1.0 的工具一起使用。无论您的工具不符合标准还是您的实际标记与您发布的不同,我都无法告诉您。唯一要尝试的明显更改是使用//div 而不是/div,因为您的目标div 不太可能是您的示例中显示的根元素。
【解决方案2】:

这个 XPath 1.0 表达式

    "concat(//div[contains(concat(' ', @data-dmid, ' '), ' decimal-price-container ')]
                 /*[@data-dmid[. = 'price-digit']],
             '.',
             //div[contains(concat(' ', @data-dmid, ' '), ' decimal-price-container ')]
                 /*[@data-dmid[. = 'price-cent']],
             //div[contains(concat(' ', @data-dmid, ' '), ' decimal-price-container ')]
                 /*[@data-dmid[. = 'price-currency']]
             )


在提供的 XML 文档上评估时

<div data-dmid="decimal-price-container" class="aci acj bt">
    <span data-dmid="price-digit" class="r t ack acl rn acm">4</span>
    <span data-dmid="price-cent" class="r t jk ack acl">95</span>
    <span data-dmid="price-currency" class="r t a jt jp acn jk">€</span>
</div>

产生想要的结果

4.95€


基于 XSLT 的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:copy-of select=
    "concat(//div[contains(concat(' ', @data-dmid, ' '), ' decimal-price-container ')]
                 /*[@data-dmid[. = 'price-digit']],
             '.',
             //div[contains(concat(' ', @data-dmid, ' '), ' decimal-price-container ')]
                 /*[@data-dmid[. = 'price-cent']],
             //div[contains(concat(' ', @data-dmid, ' '), ' decimal-price-container ')]
                 /*[@data-dmid[. = 'price-currency']]
             )
    "/>
  </xsl:template>
</xsl:stylesheet>

当对提供的 XML 文档(如上)应用此转换时,会产生所需的正确结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多