2010-07-02 1 views
1

Я пытаюсь построить Sanitize трансформатор, который принимает потенциально некорректный ввод HTML с элементами вне каких-либо тегов вообще, такие, как в этом примере:Как использовать Ruby's Sanitize/Nokogiri для доступа к непомеченным элементам?

out of a tag<p>in a tag</p>out again! 

Я хочу иметь трансформатор обернуть любой не-меченый элементы <p> тегов, так что выше трансформирует в:

<p>out of a tag</p><p>in a tag</p><p>out again!</p> 

к сожалению, я не могу понять, как выбрать неопределенный элемент, потому что это не является узел. Я уверен, что здесь что-то не хватает. Может ли кто-нибудь дать мне толчок в правильном направлении?

ответ

1
require 'nokogiri' 

html = 'out of a tag<p>in a tag</p>out again!' 

Nokogiri::HTML(html).at_css('body').children. 
    map {|x| '<p>' + x.text + '</p>' }.join('') 
#=> "<p>out of a tag</p><p>in a tag</p><p>out again!</p>" 

Текст хранится в текстовых узлах. Поскольку CSS не может выбирать текстовые узлы, вам придется использовать другие методы, чтобы получить их как Nokogiri::XML::Node#children.

+0

Удивительный, я отдам это. Спасибо. :) –

+0

@Aaron: Если это ответили на ваш вопрос, не могли бы вы щелкнуть значок проверки в верхней части моего ответа? Он ответит на этот вопрос. Благодаря! – Adrian

+0

Hi Adrian, Ваш пример отлично работает в сеансе irb, но из контекста лямбда трансформатора лямбда вызывается только один раз, для '

в теге

' сегмент. :( Оказалось, что лучше всего просто отказаться от идеи сделать это внутри трансформатора Sanitize, и было проще просто запустить Nokogiri самостоятельно на весь html-документ. Очки за то, что вы меня на правильном пути , хоть! :) –

Смежные вопросы