我有一个html页面,下面有一些html实体,如"’"。
#Here I am not pasting whole html page content. just putting issue line only
html_file = "<html>....<body><p>they’re originally intended to describe the spread of of viral diseases, but they&#146;re nice analogies for how web/SN apps grow.<p> ...</body></html>"
doc = Nokogiri::HTML(html)
body = doc.xpath('//body')
body_content = body[0].inner_html
puts body_content
结果:These terms come from the fields of medicine and biology theyu0092re originally intended to describe the spread of of viral diseases, but theyu0092re nice analogies for how web/SN apps grow.
我想让这些实体保持原样,而不是将其更改为unicode。有什么遗漏吗?
谢谢
they’re
是错误的,应该避免使用。如果您想在这里使用右单引号,以再现将撇号呈现为斜引号的印刷实践,那么正确的字符是U+2019 RIGHT SINGLE QUOTATION MARK,可以写成’
或’
。或者,如果您使用的是UTF-8,则只需逐字包含’
。
’
应该指字符U+0092,这是一个很少使用且毫无意义的控制字符,通常呈现为空白或缺少字形框。在XML中,确实是这样。
但是在HTML中(除了使用XML规则的XHTML),一个长期存在的浏览器怪怪现象是,€
到Ÿ
范围内的字符引用被错误地解释为与Windows Western代码页(cp1252)中字节128到159相关的字符,而不是具有这些代码点的Unicode字符。HTML5标准最终记录了这种行为。
问题是Nokogiri不知道这个怪癖,并把字符参考146的单词,以字符146 (u0092
)结束,你真的不想要的。我认为Nokogiri正在使用libxml2来解析HTML,因此最终正确的修复将是libxml2的htmlParseCharRef
函数,以替换字符128-159。
’
-> ’
等原始字符串替换手动"修复"字符引用。这有点错,但至少在HTML中,您可以拥有标记序列’
而不作为字符引用的唯一其他地方将是在注释中,因此,如果您不小心更改了那里的内容,希望它也不会有什么关系。
您是否尝试过更改
&#146;
到
’
我认为解析器首先解析&,然后用"#146"连接它,然后解析它们。这只是我的一个观点,我希望这只是一个评论,IDK如何,哈哈
我从focos在他的回答中得到了这个想法,从这里得到了unicode。