Как получить встроенные элементы в тексте с помощью nokogiri? - PullRequest
0 голосов
/ 03 декабря 2010

Теперь это мой HTML:

<div class="cardtextbox"><i>(<img src="/Handlers/Image.ashx?size=small&amp;name=BR&amp;type=symbol" alt="Black or Red" align="absbottom" /> can be paid with either <img src="/Handlers/Image.ashx?size=small&amp;name=B&amp;type=symbol" alt="Black" align="absbottom" /> or <img src="/Handlers/Image.ashx?size=small&amp;name=R&amp;type=symbol" alt="Red" align="absbottom" />.)</i></div><div class="cardtextbox"><img src="/Handlers/Image.ashx?size=small&amp;name=3&amp;type=symbol" alt="3" align="absbottom" /><img src="/Handlers/Image.ashx?size=small&amp;name=B&amp;type=symbol" alt="Black" align="absbottom" />, Discard a card: Target creature gets -2/-2 until end of turn.</div><div class="cardtextbox"><img src="/Handlers/Image.ashx?size=small&amp;name=3&amp;type=symbol" alt="3" align="absbottom" /><img src="/Handlers/Image.ashx?size=small&amp;name=R&amp;type=symbol" alt="Red" align="absbottom" />: Put a 2/1 red Goblin creature token with haste onto the battlefield. Exile it at the beginning of the next end step.</div></div>

И что я хотел бы получить:

[
 ["(B/R can be paid with either B or R.)"],
 ["3 B, Discard a card", "Target creature gets -2/-2 until end of turn"],
 ["3 R",                 "Put a 2/1 red Goblin creature token with haste onto the battlefield. Exile it at the beginning of the next end step."]
]

Отображение с красного => R выполняется через colorhash. Красный приходит от тега img, атрибута alt.

1 Ответ

0 голосов
/ 05 декабря 2010

Я не уверен, что такое colorhash или как оно имеет отношение к этому вопросу, но вот кое-что, что должно вас сблизить.Если вам действительно нужен вложенный массив ответов, вам нужно определить рекурсивную функцию для обработки узла и определить для себя, является ли узел листом или нет.

require 'nokogiri'
colorhash = {
  'Red'          => 'R',
  'Black'        => 'B',
  'Black or Red' => 'B/R'
}

h = Nokogiri::HTML html_from_question

# Replace all images with alt text, possibly transformed
h.xpath('//img[@alt]').each{ |i| i.swap( colorhash[i['alt']] || i['alt']) }

require 'pp'
pp h.css('.cardtextbox').map(&:text)

#=> ["(B/R can be paid with either B or R.)",
#=>  "3B, Discard a card: Target creature gets -2/-2 until end of turn.",
#=>  "3R: Put a 2/1 red Goblin creature token with haste onto the battlefield. Exile it at the beginning of the next end step."]
...