Nokogiri HTML Вложенные элементы Извлечение класса и текста

У меня есть базовая структура страницы с элементами (span), вложенными в другие элементы (div и span). Вот пример:

html = "<html>
  <body>
    <div class="item">
         <div class="profile">
      <span class="itemize">
         <div class="r12321">Plains</div>
          <div class="as124223">Trains</div>
           <div class="qwss12311232">Automobiles</div>
      </div>
      <div class="profile">
        <span class="itemize">
          <div class="lknoijojkljl98799999">Love</div>
           <div class="vssdfsd0809809">First</div>
            <div class="awefsaf98098">Sight</div>
      </div>
    </div>
  </body>
</html>"

Обратите внимание, что имена классов являются случайными. Также обратите внимание, что в HTML есть пробелы и вкладки.

Я хочу извлечь детей и получить хеш-код:

page = Nokogiri::HTML(html)
itemhash = Hash.new
page.css('div.item div.profile span').map do |divs|
  children = divs.children
  children.each do |child|
    itemhash[child['class']] = child.text
  end
end

Результат должен быть похож на:

 {\"r12321\"=>\"Plains\", \"as124223\"=>\"Trains\", \"qwss12311232\"=>\"Automobiles\", \"lknoijojkljl98799999\"=>\"Love\", \"vssdfsd0809809\"=>\"First\", \"awefsaf98098\"=>\"Sight\"}

Но я заканчиваю беспорядок как это:

 {nil=>\"\\n\\t\\t\\t\\t\\t\\t\", \"r12321\"=>\"Plains\", nil=>\" \", \"as124223\"=>\"Trains\", \"qwss12311232\"=>\"Automobiles\", nil=>\"\\n\\t\\t\\t\\t\\t\\t\", \"lknoijojkljl98799999\"=>\"Love\", nil=>\" \", \"vssdfsd0809809\"=>\"First\", \"awefsaf98098\"=>\"Sight\"}

Это из-за вкладок и пробелов в HTML. Я не имею никакого контроля над тем, как генерируется HTML, поэтому я пытаюсь обойти эту проблему. Я пробовал нобланки, но это не работает. Я также попробовал gsub, но это только разрушает мою разметку.

Как извлечь класс и значения этих вложенных элементов, не обращая внимания на пробелы и табуляции?

PS Я не зациклен на Нокогири - так что, если другой камень может сделать это лучше, я игра.

1 ответ

children Метод возвращает все дочерние узлы, включая текстовые узлы, даже если они пусты.

Чтобы получить только дочерние элементы, вы можете выполнить явный запрос XPath (или, возможно, эквивалентный CSS), например:

children = divs.xpath('./div')

Вы также можете использовать children_elements метод, который будет ближе к тому, что вы уже делаете, и который возвращает только дочерние элементы, которые являются элементами:

children = divs.element_children
Другие вопросы по тегам