Получить текст после тега, содержащий другой текст - PullRequest
1 голос
/ 17 июля 2011

Например:

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

3 голосов
/ 17 июля 2011

Здесь

doc = Nokogiri::HTML(html)
puts doc.at('b[text()="Wins:"]').next.text
1 голос
/ 17 июля 2011

Я бы использовал чистый XPath как:

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

Я слышал тысячи раз (и от гуру) "никогда не используйте регулярные выражения для анализа XML" . Можете ли вы предоставить какую-то «шокирующую» ссылку, демонстрирующую, что это предложение больше не действует?

1 голос
/ 17 июля 2011

Вы можете использовать этот XPath: //*[*/text() = 'Wins:']/text() Он вернет 1,017.

О регулярном выражении: RegEx соответствует открытым тегам, кроме автономных тегов XHTML

0 голосов
/ 17 июля 2011

Использование :

//*[. = '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]
...