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