2016-12-09 24 views
0

我有一个嵌套在其他元素(div和span)下的元素(span)的基本页面结构。下面是一个例子:Nokogiri HTML嵌套元素提取类和文本

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的生成方式没有任何控制,所以我试图解决这个问题。我试过noblanks,但那不起作用。我也尝试过gsub,但这只会破坏我的标记。

如何在干净地忽略空格和制表符的情况下提取这些嵌套元素的类和值?

P.S.我没有挂在Nokogiri - 所以如果另一颗宝石可以做得更好,我就是游戏。

回答

1

children方法返回所有子节点,包括文本节点 - 即使它们是空的。

只得到你可以做一个明确的XPath查询(或可能相当于CSS)的子元素,如:

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

您也可以使用children_elements method,这将是更接近你已经在做,并且只返回作为元素的儿童:

children = divs.element_children