获取标记后面的文本,包含另一个文本

时间:2011-07-17 06:33:37

标签: ruby regex parsing xpath nokogiri

例如:

<p>
<b>Member Since:</b> Aug. 07, 2010<br><b>Time Played:</b> <span class="text_tooltip" title="Actual Time: 15.09:37:06">16 days</span><br><b>Last Game:</b>
<span class="text_tooltip" title="07/16/2011 23:41">1 minute ago</span>
<br><b>Wins:</b> 1,017<br><b>Losses / Quits:</b> 883 / 247<br><b>Frags / Deaths:</b> 26,955 / 42,553<br><b>Hits / Shots:</b> 690,695 / 4,229,566<br><b>Accuracy:</b> 16%<br>
</p>

我想得到1,017。它是标记后面的文字,包含文字Wins: 如果我使用正则表达式,它将是[/<b>Wins:<\/b> ([^<]+)/,1],但如何使用Nokogiri和XPath? 或者我应该用正则表达式更好地解析这部分页面吗?

4 个答案:

答案 0 :(得分:3)

下面

doc = Nokogiri::HTML(html)
puts doc.at('b[text()="Wins:"]').next.text

答案 1 :(得分:1)

您可以使用此XPath://*[*/text() = 'Wins:']/text()它将返回1,017

关于正则表达式:RegEx match open tags except XHTML self-contained tags

答案 2 :(得分:1)

我会使用纯XPath:

"//b[.='Wins:']/following::node()[1]"

我已经听过数千次(并且来自大师)“从不使用正则表达式解析XML”。你能提供一些“令人震惊”的参考资料,证明这句话不再有效吗?

答案 3 :(得分:0)

使用

//*[. = 'Wins:']/following-sibling::node()[1]

如果这是不明确的(选择多个节点),可以指定更严格的表达式:

//*[. = 'Wins:']/following-sibling::node()[self::text()][1]

或者:

(//*[. = 'Wins:'])[1]/following-sibling::node()[1]

或者:

(//*[. = 'Wins:'])[1]/following-sibling::node()[self::text()][1]