【问题标题】:Exclude tag based on class and style in xpath在 xpath 中根据类和样式排除标记
【发布时间】:2012-02-26 22:50:20
【问题描述】:

我有以下代码用于 xpath 查询...

<div class="buying">


<h1 class="parseasinTitle ">

<span id="btAsinTitle">Top Ten Tips for Growing Your Own Tomatoes (The Basic Art of Italian Cooking) <span style="text-transform: capitalize; font-size: 16px;">[Kindle Edition]</span></span>


</h1>
</div>

我只是想提取

种植自己的西红柿的十大技巧(意大利烹饪的基本艺术)

所以我将textContent 与以下 xpath 查询一起使用

$xpath_books->query('//span[@id="btAsinTitle"]')

但结果是

种植自己的西红柿的十大技巧(意大利烹饪的基本艺术)[Kindle 版]

我想,我必须排除 &lt;span style="text-transform: capitalize; font-size: 16px;"&gt; 才能达到我的目的, 我该怎么做 ?

【问题讨论】:

    标签: php xml regex parsing xpath


    【解决方案1】:

    使用这个 XPath:

    //span[@id="btAsinTitle"]/text()
    

    【讨论】:

    • 好吧,我所知道的是,text() 函数用于从节点中提取文本,但我在这里感到困惑,为什么它在我的情况下有效? 【kindle加法】也是文字?为什么会这样?
    • 我猜原因是,[kindle edition] 包含在另一个 '' 中,所以它被删除了,并且提取了 xpath 所选跨度周围的文本,我正确吗?
    • @NewBee,此查询使用text() 函数选择span[@id="btAsinTitle"] 子文本节点。此跨度仅包含 1 个子节点 - Top Ten Tips for Growing Your Own Tomatoes (The Basic Art of Italian Cooking)。文本节点[Kindle Edition] 是其他span 的子文本节点。
    【解决方案2】:

    您的 XPath 确实只返回带有 id 的节点,但是因为 DOM 是链接的 DOMNode 的树,所以返回的节点将包含子节点。而当你用nodeValuetextContent访问返回的span时,PHP会返回所有子节点的组合DOMText节点,包括持有“Kindle版”的子span。

          SPAN
         /    \
       TEXT   SPAN
                \
                TEXT
    

    更多信息请访问DOMDocument in php

    如果只想获取第一个文本部分,则必须获取第一个 childNode 的 nodeValue:

    echo $result->item(0)->childNodes->item(0)->nodeValue;
    

    直接使用 XPath 获取该字符串的替代方法是

    echo $xpath->evaluate('string(//span[@id="btAsinTitle"]/text())');
    

    http://php.net/manual/en/domxpath.evaluate.php

    如果您想返回整个 DOMText 节点,请使用

    //span[@id="btAsinTitle"]/text()
    

    【讨论】:

    • 谢谢@Gordon,你回答的只是我刚才在问自己......
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2012-02-20
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多