Hpricot:如何在没有其他html子元素的情况下提取内部文本



我正在开发一个vim-rspec插件(https://github.com/skwp/vim-rspec)-我正在解析rspec中的一些html。它看起来像这样:

doc = %{
<dl>
  <dt id="example_group_1">This is the heading text</dt>
  Some puts output here
 </dl>
}

我可以使用获得整个内部

(Hpricot.parse(doc)/:dl).first.inner_html

我可以使用只得到dt

(Hpricot.parse(doc)/:dl).first/:dt

但是,我如何访问"有些人在这里输出"区域?如果我使用inner_html,就会有太多其他垃圾需要解析。我浏览了hpricot文档,但没有发现一种简单的方法来获取html元素的内部文本,而不考虑其html子元素。

我最终通过手动解析子项,自己找到了一条路线:

(@context/"dl").each do |dl|
  dl.children.each do |child|
    if child.is_a?(Hpricot::Elem) && child.name == 'dd'
      # do stuff with the element
    elsif child.is_a?(Hpricot::Text)
      text=child.to_s.strip
      puts text unless text.empty?
    end
  end
  1. 请注意,这是一个糟糕的HTML。如果您可以控制它,那么应该将您想要的内容包装在<dd>中。

  2. 在XML术语中,您要查找的是<dt>元素后面的TextNode。在我的评论中,我展示了如何在Nokogiri中使用XPath选择这个节点。

  3. 然而,如果你必须使用Hpricot,并且不能使用它选择文本节点,那么你可以通过获得inner_html,然后去掉不需要的:来破解它

    (Hpricot.parse(doc)/:dl).first.inner_html.sub %r{<dt>.+?</dt>}, ''
    

相关内容

  • 没有找到相关文章

最新更新