使用Nokogiri解析具有特殊字符的文档

时间:2011-01-15 05:30:26

标签: ruby-on-rails ruby nokogiri

我正在使用Nokogiri解析包含特殊字符的网页但是这些特殊字符无法正确解析它们显示为“genealógica”,这是我打开文档的方式

def self.get_chapter book,chapters
        doc=Nokogiri::HTML(open("#{BASE_URL}search=#{book}#{chapters}&version=NVI")).css('.result-text-style-normal')
        doc.css('.footnotes').remove
        doc.css('h4').remove
        doc
end

我有什么想法可以解决这个问题?

3 个答案:

答案 0 :(得分:2)

编辑:我在页面上做了一些更多的工作,你是如何处理它的,并认为这更好。我改变了你处理页面的方式,因为它不像我喜欢的那样清晰,可维护性和可读性。

require 'addressable/uri'
require 'nokogiri'
require 'open-uri'

def get_chapter(base_url, params={})
  uri = Addressable::URI.parse(base_url)
  uri.query_values = params

  doc = Nokogiri::XML(open(uri.to_s))
  doc.encoding = 'UTF-8'

  div = doc.at_css('.result-text-style-normal')
  div.css('.footnotes').remove
  div.css('h4').remove

  doc
end

page = get_chapter('http://www.biblegateway.com/passage/', :search => 'Mateo1-2', :version => 'NVI')
puts page.content

不是像你那样构建一个URL,而是希望看到它以块的形式传入,基本URL和参数分开。我使用Addressable gem构建URI,这是我修改URL的首选。 Ruby的内置URI现在有一些growing pains,与参数编码有关。

您提供的URL远端的文档说它是XHTML,因此它应该符合XHTML规范。您可以使用Nokogiri::HTML()解析XHTML,但我认为使用更严格的Nokogiri::XML()可以获得更好的结果。

为了让Nokogiri在解析内容的方向上有一个额外的推动,我补充道:

doc.encoding = 'UTF-8'

我更喜欢找到所需的div并将其分配给一个临时变量,然后从那一点开始工作,而不是像你那样将它链接到解析步骤。这种方式更具惯用性和可读性,因为我们正在处理文档的块。

运行代码输出看起来很漂亮和干净的内容。有一些嵌入式Javascript,但这是不可避免的,因为Javascript被视为<script>标签内的文本。如果您要呈现要呈现的浏览器的HTML,那么这不是问题。

答案 1 :(得分:0)

将Nokogiri :: HTML (...)更改为Nokogiri :: HTML5 (...)应该会有所帮助。

示例:

url = 'https://www.youtube.com/watch?v=4r6gr7uytQA'

doc = Nokogiri::HTML(open(url))
doc.title
=> "Josh Waitzkin â\u0080\u0094 How to Cram 2 Months of Learning into 1 Day | The Tim Ferriss Show - YouTube"

doc = Nokogiri::HTML5(open(url))
doc.title
=> "Josh Waitzkin — How to Cram 2 Months of Learning into 1 Day | The Tim Ferriss Show - YouTube"

答案 2 :(得分:-1)

如果你使用1.9,你可以简单地说

coding: utf-8

在顶部,nokogiri接受了其余的。如果您需要再次将数据设为外部数据,则可以使用iconv。