2014-01-23 42 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

相關問題