Разбор документа со специальными символами, используя Nokogiri - PullRequest
0 голосов
/ 15 января 2011

Я анализирую веб-страницу, которая содержит специальные символы с использованием 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

любые идеи, какЯ мог бы это исправить?

Ответы [ 2 ]

2 голосов
/ 15 января 2011

РЕДАКТИРОВАТЬ: я сделал немного больше работы, глядя на страницу, как вы пытаетесь обработать ее, и думаю, что это работает лучше. Я также изменил способ обработки страницы, потому что он был не так понятен, как то, как мне нравится его видеть, для удобства обслуживания и удобства чтения.

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-адреса и параметров. Я создаю URI, используя Addressable gem, который является моим способом обращения к URL-адресам. Встроенный в Ruby URI сейчас испытывает некоторые проблемы с ростом , связанные с кодированием параметров.

Документ в дальнем конце URL-адреса, который вы дали, говорит, что это XHTML, поэтому он должен соответствовать спецификациям XHTML. Вы можете проанализировать XHTML, используя Nokogiri::HTML(), но я думаю, что вы получите лучшие результаты, используя Nokogiri::XML(), что более строго.

Чтобы дать Нокогири дополнительный толчок в правильном направлении для анализа содержимого, я добавляю:

doc.encoding = 'UTF-8'

Я предпочитаю найти нужный div и присвоить его временной переменной и работать с этого момента, а не делать это прикованным цепью к шагу разбора, как вы. Это немного более идиоматично и читабельно, потому что мы имеем дело с фрагментами документа.

Запуск кода выводит то, что кажется хорошим и чистым содержимым. Есть некоторый встроенный Javascript, но это неизбежно, потому что Javascript рассматривается как текст внутри тегов <script>. Это не проблема, если вы представляете HTML-код для отображения в браузере.

0 голосов
/ 15 января 2011

Если вы используете 1.9, вы можете просто поставить </p> <h1>coding: utf-8</h1> <p>

Наверху нокогири подбирает остальных. Если вам нужно снова сделать данные внешними, вы можете использовать iconv.

...