Я хочу заменить inner_text во всех абзацах в моем документе XHTML.
Я знаю, что могу получить весь текст с Nokogiri как это
doc.xpath("//text()")
Но я хочу, только воздействуют на текст в абзацах, как я могу выбрать весь текст в абзацах, не влияя на в конечном счете существующие тексты привязки в ссылках?
#For example : <p>some text <a href="/">This should not be changed</a> another one</p>
Для текста, который является непосредственным потомком абзаца, используйте // p / text ()
irb> h = '<p>some text <a href="/">This should not be changed</a> another one</p>'
=> ...
irb> doc = Nokogiri::HTML(h)
=> ...
irb> doc.xpath '//p/text()'
=> [#<Nokogiri::XML::Text:0x80ac2e04 "some text ">, #<Nokogiri::XML::Text:0x80ac26c0 " another one">]
Для текста, который является потомком (непосредственным или нет) использования абзаца // p // text (). Чтобы исключить те тексты, у которых якорь является родительским, вы можете просто вычесть их.
irb> doc.xpath('//p//text()') - doc.xpath('//p//a/text()')
=> [#<Nokogiri::XML::Text:0x80ac2e04 "some text ">, #<Nokogiri::XML::Text:0x80ac26c0 " another one">]
Вероятно, есть способ сделать это с помощью одного вызова, но мои знания xpath не настолько глубоки.