2014-01-23 45 views
0

我试图解析我的Facebook消息历史记录,因为我感兴趣的是谁使用哪些词,并且多长时间一次以及类似的东西。获取包含具有某个值的节点的节点的下一个节点

这是一个节点,表示两个人(玛丽和约翰)之间的对话结构:

<div class="thread"> 

Mary Smith, John Smith 

<div class="message"> 
    <div class="message_header"> 
     <span class="user">Mary Smith</span> 
     <span class="meta">Saturday, October 12, 2013 at 12:53am UTC+02</span> 
    </div> 
</div> 
<p>Hello, how are you?</p> 

<div class="message"> 
    div class="message_header"> 
     <span class="user">John Smith</span> 
     <span class="meta">Saturday, October 12, 2013 at 12:55am UTC+02</span> 
    </div> 
</div> 
<p>I am fine, thank you for asking.</p> 

</div> 

我要取它的作者是玛丽(使用XPath)的所有消息。我可以承认,事情是由玛丽写的消息,因为它是在一个pmessage具有message_header类的子类div具有span孩子user类,其内容包括“玛丽”的类的div后。

我尝试:

//div[@class="thread"]/p[preceding-sibling::div[@class="message"][div[@class="message_header"][span[@class="user"][contains(., "Mary")]]]] 

这可能是也可能不是正确的,但它是不可用的,因为它的速度太慢。 有没有更聪明的方法来写这个查询?

哦,我正在使用Ruby + Nokogiri解析文档,但我不确定这是否相关。

回答

1

用更灵活的结构

喜欢的东西

//div[.//text()="Mary Smith"]/following-sibling::p[1] 

肯定会缩短你的XPath。不幸的是,我对处理速度并不了解,但我认为更少的测试意味着更快的执行速度。如果有很多节点之间的文本字段,并没有很多的span它可能会更快做

//div[.//span[@class="user"]/text()="Mary Smith"]/following-sibling::p[1] 

让我知道这显著提高了速度!

采用刚性结构

如果结构是固定的,你表现出,它可能会更快,使用固定的路径,避免//尽可能:

//div[div/span/text()="Mary Smith"]/following-sibling::p[1] 
+0

最后一个选项是快它的工作原理。谢谢。 – iCanLearn

相关问题