我正在尝试解析我的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
,其中div
有message_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来解析文档,但我不确定这是否相关。
答案 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]