Чтобы получить лучший ответ, вам нужно будет точно указать, какой формат имеют значения AB, CD и Dollar, но вот решение, основанное на приведенном примере. Он использует группу регулярных выражений ()
для сбора интересующей нас информации. (Подробнее см. В нижней части ответа)
text = p.css(".some_class").text
# one or more digits followed by a space followed by AB, capture the digits
ab = text.match(/(\d+) AB/).captures[0] # => "12"
# one of more non digits followed by a literal + followed by CD
cd = text.match(/(\d+\+) CD/).captures[0] # => "4+"
# digits or commas followed by "Dollars"
dollars = text.match(/([\d,]+) Dollars/).captures[0] # => "2,600"
Обратите внимание, что если совпадения нет, то String#match
возвращает nil
, поэтому, если значения могут не существовать, вам потребуется проверка, например.
if match = text.match(/([\d,]+) Dollars/)
dollars = match.captures[0]
end
Дополнительное объяснение захвата
Чтобы соответствовать количеству AB, нам нужен шаблон /\d+ AB/
для определения правой части текста. Однако на самом деле нас интересует только числовая часть, поэтому мы заключаем ее в скобки, чтобы мы могли ее извлечь. например
irb(main):027:0> match = text.match(/(\d+) AB/)
=> #<MatchData:0x2ca3440> # the match method returns MatchData if there is a match, nil if not
irb(main):028:0> match.to_s # match.to_s gives us the entire text that matched the pattern
=> "12 AB"
irb(main):029:0> match.captures
=> ["12"]
# match.captures gives us an array of the parts of the pattern that were enclosed in ()
# in our example there is just 1 but there could be multiple
irb(main):030:0> match.captures[0]
=> "12" # the first capture - the bit we want
Ознакомьтесь с документацией для MatchData, в частности захватывает метод для получения более подробной информации.
person
mikej
schedule
17.07.2010