Вот некоторые вещи о том, что Nokogiri возвращает при поиске, и более упрощенные способы сделать это:
search
возвращает набор узлов, который похож на массив.Будьте осторожны при запросе атрибута узла, когда у вас есть набор узлов.
doc = Nokogiri::HTML(html)
doc.search('option[@selected="selected"]').class # => Nokogiri::XML::NodeSet
Доступ к члену набора узлов с помощью индексации:
doc.search('option[@selected="selected"]').first.attr('value') # => "EUR"
doc.search('option[@selected="selected"]')[0].attr('value') # => "EUR"
Это работает, но я считаю его непреднамереннымпобочный эффект:
doc.search('option[@selected="selected"]').attr('value') # => #<Nokogiri::XML::Attr:0x80427464 name="value" value="EUR">
Это то же самое, но оно завершается ошибкой, за исключением:
doc.search('option[@selected="selected"]')['value']
# ~> -:26:in `[]': can't convert String into Integer (TypeError)
# ~> from -:26:in `<main>'
Поскольку вы хотите выбрать выбранную опцию внутри тега с идентификатором, я бы пошелпосле этого с помощью CSS-селекторов.at_css
, at
и %
возвращают один узел, упрощая задачу.
doc.at_css('#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"
doc.at('#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"
(doc % '#DisplayCurrency option[@selected="selected"]')['value'] # => "EUR"