Hpricot: Как извлечь внутренний текст без других HTML-подэлементов - PullRequest
1 голос
/ 23 января 2012

Я работаю над плагином vim rspec (https://github.com/skwp/vim-rspec) - и я разбираю html из rspec. Выглядит это так:

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 docs, но не вижу простого способа получить по существу внутренний текст html-элемента, не обращая внимания на его html-дочерние элементы.

Ответы [ 2 ]

1 голос
/ 24 января 2012

В итоге я сам определил маршрут, вручную проанализировав детей:

(@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
0 голосов
/ 23 января 2012
  1. Обратите внимание, что у вас плохой HTML.Если у вас есть контроль над ним, вы должны обернуть содержимое, которое вы хотите, в <dd>.

  2. В терминах XML вам нужен TextNode, следующий за элементом <dt>.В своем комментарии я показал, как вы можете выбрать этот узел с помощью XPath в Nokogiri.

  3. Однако, если вы должны использовать Hpricot и не можете выбирать текстовые узлы, используя его, то вы можете взломать его с помощьюполучить inner_html и затем удалить нежелательное:

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