从Nokogiri::XML::DocumentFragment
删除所有标记的简单方法是,只保留以空格分隔的文字?
我想改造:
Hello<br>My name is McOmghall
成:
Hello My name is McOmghall
我的解决方案是:
Nokogiri::XML.fragment(html_text).children.to_a.flatten.select { |node| node.class == Nokogiri::XML::Text}
然后连接该数组在每个元素之间放置空格,但我认为它不是最理想的而且不是很清楚。
编辑:
这是我的最终解决方案:
Nokogiri::XML.fragment(html_text).xpath('.//text()').map(&:text).join(' ')
答案 0 :(得分:5)
root = Nokogiri::HTML('<div id="test">Hello<br>My name is McOmghall</div>')
root.at_css('#test').text
# => "HelloMy name is McOmghall"
root.at_css('#test').xpath('.//text()').map(&:text)
# => ["Hello", "My name is McOmghall"]
p root.at_css('#test').xpath('.//text()').map(&:text).join(' ')
# => "Hello My name is McOmghall"
答案 1 :(得分:2)
Nokogiri
有一个非常方便的方法text?
:
html = "Hello<br>My name is McOmghall"
Nokogiri::HTML.fragment(html).children.select(&:text?).join(' ')
# => "Hello My name is McOmghall"
答案 2 :(得分:0)
如果br
之前或之后没有空格,则文字中不会有空格
doc = Nokogiri::HTML 'Hello<br>My name is McOmghall'
doc.text
#=> "HelloMy name is McOmghall"
在每个br
之后添加空格很容易:
doc.search('br').each{|br| br.after ' '}
doc.text
#=> "Hello My name is McOmghall"