如何使用 Nokogiri 从此 HTML 中提取文本并保留<br>元素?



我有这个字符串

<?xml version="1.0" encoding="UTF-8"?>n<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd">nnn<en-note>n<font size="5">text_part_1</font><br><br>n<font size="5">text_part_2</font><br><br>n<font size="5">text_part_3</font>

我需要提取文本内容,还要保留<br>元素。所以结果是

text_part_1<br><br>text_part_2<br><br>text_part_3

我怎么能用野村来做这件事?

问题的一部分是,您的XML是非法的。<br>未终止;它应该是XML中的<br/>,或者有一个结束标记,即</br>

因此,Nokogiri在尝试解析XML时引发了错误。如果你在解析后检查errors方法,你会看到这样的东西:

[
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 7>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 7>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 6>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag br line 6>,
#<Nokogiri::XML::SyntaxError: Premature end of data in tag en-note line 5>
]

解决这个问题,Nokogiri将能够正确处理XML。到那时,你将能够做一些简单的事情,比如:

require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd">

<en-note>
<font size="5">text_part_1</font><br/><br/>
<font size="5">text_part_2</font><br/><br/>
<font size="5">text_part_3</font>
EOT
doc.search('br').each do |br|
br.replace('##br##')
end

text = doc.content.gsub('##br##', '<br/>')
puts text

以下是经过校正的br标签的输出:

text_part_1<br/><br/>
text_part_2<br/><br/>
text_part_3

修复XML的最简单方法是在解析它之前运行一些清理代码,比如:

doc = Nokogiri::XML(xml.gsub('<br>', '<br/>'))

其中xml是包含XML内容的变量。

怎么样:

html =  "<?xml version="1.0" encoding="UTF-8"?>n<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml.dtd">nnn<en-note>n<font size="5">text_part_1</font><br><br>n<font size="5">text_part_2</font><br><br>n<font size="5">text_part_3</font>"
doc = Nokogiri::HTML(html)
str = ""
doc.traverse { |n| str << n.to_s if (n.name == "text" or n.name == "br") }
str #=> "text_part_1<br><br>text_part_2<br><br>text_part_3"

相关内容

最新更新