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

时间:2012-01-22 22:53:50

标签: ruby parsing vim rspec hpricot

我正在开发一个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

但是如何才能访问“Some puts output here”区域?如果我使用inner_html,还有太多其他垃圾要解析。我查看了hpricot文档,但是没有看到一个简单的方法来获取html元素的内部文本,而忽略了它的html子元素。

2 个答案:

答案 0 :(得分:1)

我最终通过手动解析孩子来找出自己的路线:

(@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 :(得分:0)

  1. 请注意,这是您的HTML。如果您可以控制它,则应将所需内容包装在<dd>中。

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

  3. 但是,如果您必须使用Hpricot,并且无法选择使用它的文本节点,那么您可以通过获取inner_html然后删除不需要的内容来解决这个问题:

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