获取包含具有某个值的节点的节点的下一个节点

时间:2014-01-23 17:48:41

标签: xpath

我正在尝试解析我的Facebook消息历史记录,因为我对谁经常使用哪些词以及类似的东西感兴趣。

这是代表两个人(Mary和John)之间对话的节点结构:

<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>

我想获取作者是Mary(使用XPath)的所有邮件。我可以认识到某些内容是由Mary编写的消息,因为它位于p课程div之后的message,其中divmessage_header个课span其中user子级为//div[@class="thread"]/p[preceding-sibling::div[@class="message"][div[@class="message_header"][span[@class="user"][contains(., "Mary")]]]] ,其内容包含“Mary”。

我的尝试:

{{1}}

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

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

1 个答案:

答案 0 :(得分: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]