【问题标题】:Parsing document with special characters, using Nokogiri使用 Nokogiri 解析带有特殊字符的文档
【发布时间】:2011-01-15 05:30:25
【问题描述】:

我正在使用 Nokogiri 解析包含特殊字符的网页,但特殊字符没有被正确解析 - 显示为“genealógica”

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

有什么办法可以解决这个问题吗?

【问题讨论】:

标签: ruby-on-rails ruby nokogiri


【解决方案1】:

编辑:我做了更多的工作来查看页面,您尝试如何处理它,并认为这会更好。我还更改了您处理页面的方式,因为它不像我喜欢的那样清晰,可维护性和可读性。

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 以供浏览器呈现,这不是问题。

【讨论】:

  • 谢谢,这看起来确实更好,它教会了一些新东西,我是 Rails 和 ruby​​ 的新手
【解决方案2】:

将 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"

【讨论】:

    【解决方案3】:

    如果您使用的是 1.9,您可以简单地将

    编码:utf-8

    在顶部,nokogiri 接手其余部分。如果您需要再次将数据变为外部数据,您可以使用 iconv。

    【讨论】:

    • 请解释设置源文件编码将如何帮助解析外部 XHTML 文件。
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多