2014-02-10 116 views
1

我在这里发布,希望有专家权衡如何最好地结合不同节点深度的文本值和被索引的文本值。XPath 1.0 - 在不同节点深度选择文本

我想弄清楚如何从以下两个语句创建一个XPath 1.0语句。文本值位于不同的深度,第二个语句具有索引文本值。是

这两个路径我想结合如下:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/a/text() 
div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/text()[2] 

在此驻留是其中评论海报提供他们的姓名作为任一种锚(从中接触)或是上下文只是纯文本。

在第一条语句中选择的文本来自没有嵌套文本的锚点。在第二条语句中选择的文本需要索引,因为相邻或嵌套的文本存在,因此必须明确提供。

任何有关此事的建议或指导将不胜感激。

谢谢 迈克尔

编辑/后随

下面的摘录显示HTML(只是标签),但在特定的div类值留下的下调版本。在原来的问题提供的XPath值对应于从li以下项目正在取得XPath查询:

<html> 
    <body> 
    <div> 
     <div> 
     <div> 
      <ol> 
      <li> 
       <div> 
       <div class="comment-author vcard"> 
        <a>candaceerin</a> 
        <div class="commentmetadata">...</div> 
       </div> 
       </div> 
      </li> 
      <li> 
       <div> 
       <div class="comment-author vcard"> 
        <img/> Rachel 
        <div class="commentmetadata">...</div> 
       </div> 
       </div> 
      </li> 
      </ol> 
     </div> 
     </div> 
    </div> 
    </body> 
</html> 
+2

您能否提供一个两个配置的示例片段,使其对所有人都更加直观?根据模式,'div/div // text()'可能会诀窍 – Robin

+0

感谢Robin,我正在评估一个网站来提取客户端的内容。该网页是:[链接](http://mybrownbaby.com/2014/01/the-problem-with-parenting-from-your-own-pain/),特别是底部的评论。当查看用户/海报名称时,一些名称是超链接(例如,candaceerin),而另一些则不是(例如,Rachel)。该网站将用户/海报名称显示为超链接或文字。 – Michael

回答

0

使用union operator|将它们组合成一个XPath语句:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/a/text() | 
div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/text()[2] 

以下XPath表达式也可能工作,但它们很难看:

选项1:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]//text() 
    [(parent::div and position()=2) or parent::a[parent::div]] 

选项2:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]//text() 
    [ 
    (parent::div[contains(concat(' ', @class, ' '), ' comment-author ')]/parent::div 
    and position()=2) 
    or parent::a[div[contains(concat(' ', @class, ' '), ' comment-author ')]/parent::div] 
    ] 
+0

谢谢Mads作为选项1为我的案件工作。尽管它可能很丑,但它可以以可重复和一致的方式适用于我的案例。感谢帮助! – Michael

0

你真的应该编辑你的答案,以显示HTML的相关一部分,而不是只是链接到的意见一整页。你已经熟悉结构,然而我们需要花时间和精力去到那里,试着去看看你在说什么。此外,您的问题对于可能存在相同问题的其他人来说并不真正有用。

不管怎么说,这个XPath应该抓住你想要什么:

// DIV [包含(@class, '评论的作者')] //文本()[正常化空间(),而不是(祖先:: DIV [@类= “commentmetadata”)]

//div[contains(@class, 'comment-author')]选择与评论的股利,那么你试图抓住所有用文字//text()。之后,您需要检查文本字符串是否为空,并且该字符串不是注释的日期,该日期在<div class="commentmetadata"">中给出。