如何定义一个只从两个相似div中的第一个中检索带连字符的元素的xpath表达式?

时间:2010-10-31 11:49:34

标签: xpath

下面的div在我正在解析的HTML中以该顺序出现。

//div[contains(@class,'top-container')]//font/text()

我正在使用上面的xpath表达式尝试获取下面第一个div中的任何数据,其中使用连字符来分隔数据:

Wednesday - Chess at Higgins Stadium
Thursday - Cook-off

问题是我从下面的第二个div获取数据,例如:

Monday 10:00 - 11:00
Tuesday 10:00 - 11:00

如何仅从第一个div中检索数据? (我还想排除第一个div中不包含这个带连字符的数据的任何元素)?

<div class="top-container"> 
<div dir="ltr"> 
<div dir="ltr"><font face="Arial" color="#000000" size="2">Wednesday - Chess at Higgins Stadium</font></div> 
<div dir="ltr"><font face="Arial" size="2">Thursday - Cook-off</font></div> 
<div dir="ltr"><font face="Arial" size="2"></font>&nbsp;</div> 
<div dir="ltr">&nbsp;</div> 
<div dir="ltr"><font face="Arial" color="#000000" size="2"></font>&nbsp;</div>
</div> 

<div dir="ltr"> 
<div RE><font face="Arial"> 
<div dir="ltr"> 
<div RE><font face="Arial" size="2"><strong>Alex Dawkin </strong></font></div> 
<div RE><font face="Arial" size="2">Monday 10:00 - 11:00 </font></div> 
<div RE><font size="2">Tuesday 10:00 - 11:00 </font></div> 
<div RE> 
<div RE><font face="Arial" size="2"></font></div><font face="Arial" size="2"></font></div> 
<div RE>&nbsp;</div> 
<div RE>&nbsp;</div> 

1 个答案:

答案 0 :(得分:1)

您的XPATH与 任何 font元素匹配,后者是<div class="top-container">的后代。

div[1]将解决“top-container”元素的第一个div子元素。如果将其添加到XPATH,它将返回所需的结果。

//div[contains(concat(' ',@class,' '),' top-container '))]/div[1]//font/text()

如果您想确保只解决包含“ - ”的text()个节点,那么您还应该为text()添加谓词过滤器。

//div[contains(concat(' ',@class,' '),' top-container '))]/div[1]//font/text()[contains(.,'-')]

  

而不是只检查节点   包含“ - ”,你会如何修改   要检查的最后一个表达式   非空字符串?

如果要返回任何带有值的text()节点,则不需要text()上的谓词过滤器。如果文本节点没有内容,则它不是文本节点,也不会被选中。

但是,如果您只想选择包含空白以外的文字的text()个节点,则可以使用以下表达式:

//div[contains(concat(' ',@class,' '),' top-container '))]/div[1]//font/text()[normalize-space()]

normalize-space()删除任何前导和尾随空白字符。因此,如果text()仅包含空格(包括&nbsp;),则结果将无效,并在谓词过滤器中评估为false(),因此只有text()包含其他内容将选择空格。