27

Nokogiriとopen-uriを使用してWebページのタイトルタグの内容を取得していますが、アクセント付きの文字に問題があります。これらに対処するための最良の方法は何ですか?これが私がしていることです:

require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open(link))
title = doc.at_css("title")

この時点で、タイトルは次のようになります。

ラグ\303\ 271

それ以外の:

ラグー

nokogiriに適切な文字(この場合はùなど)を返すにはどうすればよいですか?

URLの例を次に示します。

http://www.epicurious.com/recipes/food/views/Tagliatelle-with-Duck-Ragu-242037

4

8 に答える 8

62

概要:オープンURIを介してUTF-8をNokogiriにフィードする場合open(...).readは、結果の文字列を使用してNokogiriに渡します。

分析: curlを使用してページをフェッチすると、ヘッダーが正しく表示Content-Type: text/html; charset=UTF-8され、ファイルの内容に有効なUTF-8が含まれます"Genealogía de Jesucristo"。しかし、Rubyファイルに魔法のコメントを付けてdocエンコーディングを設定しても、それは良くありません。

# encoding: UTF-8
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI'))
doc.encoding = 'utf-8'
h52 = doc.css('h5')[1]
puts h52.text, h52.text.encoding
#=> Genealogà a de Jesucristo
#=> UTF-8

これはopen-uriのせいではないことがわかります。

html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI')
gene = html.read[/Gene\S+/]
puts gene, gene.encoding
#=> Genealogía
#=> UTF-8

これは、open-uriを扱う際ののこぎりの問題のようです。これは、HTMLを生の文字列としてNokogiriに渡すことで回避できます。

# encoding: UTF-8
require 'nokogiri'
require 'open-uri'

html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI')
doc = Nokogiri::HTML(html.read)
doc.encoding = 'utf-8'
h52 = doc.css('h5')[1].text
puts h52, h52.encoding, h52 == "Genealogía de Jesucristo"
#=> Genealogía de Jesucristo
#=> UTF-8
#=> true
于 2011-01-15T20:47:21.413 に答える
36

私は同じ問題を抱えていましたが、Iconvアプローチは機能していませんでした。Nokogiri::HTMLのエイリアスNokogiri::HTML.parse(thing, url, encoding, options)です。

だから、あなたはただする必要があります:

doc = Nokogiri::HTML(open(link).read, nil, 'utf-8')

そして、ページエンコーディングを適切にutf-8に変換します。Ragùの代わりに表示されますRag\303\271

于 2011-01-24T13:37:24.540 に答える
11

「このように見える」と言うとき、あなたはこの値IRBを見ていますか?非ASCII範囲の文字をエスケープし、文字を表すバイトシーケンスをCスタイルでエスケープします。

プットを使用して印刷すると、シェルコンソールが問題の文字列と同じエンコーディングを使用していると想定して、期待どおりに元に戻ります(この場合、その文字に対して返された2バイトに基づくUTF-8のようです)。 。値をテキストファイルに保存している場合は、ハンドルに出力するとUTF-8シーケンスが生成されます。

UTF-8と他のエンコーディングの間で変換する必要がある場合、詳細はRuby1.9と1.8.6のどちらを使用しているかによって異なります。

1.9の場合:http://blog.grayproductions.net/articles/ruby_19s_string for 1.8の場合、おそらくIconvを確認する必要があります。

また、WindowsでCOMコンポーネントを操作する必要がある場合は、次のような正しいエンコーディングを使用するようにrubyに指示する必要があります。

require 'win32ole'

WIN32OLE.codepage = WIN32OLE::CP_UTF8

mysqlを操作している場合は、テーブルの照合を、使用しているエンコーディングをサポートする照合に設定する必要があります。一般に、コンテンツの一部が他のエンコーディングで返される場合でも、照合をUTF-8に設定するのが最善です。必要に応じて変換する必要があります。

Nokogiriには(おそらくIconvを介して)さまざまなエンコーディングを処理するためのいくつかの機能がありますが、私はそれについて少し練習していないので、他の誰かに説明を任せます。

于 2010-04-03T20:06:52.127 に答える
6

次のように、Nokogiriのエンコードオプションを設定してみてください。

require 'open-uri'
require 'nokogiri'
doc = Nokogiri::HTML(open(link))
doc.encoding = 'utf-8'
title = doc.at_css("title")
于 2010-07-31T15:50:00.303 に答える
1

スクレイピングされているWebサイト(ここではepicurious.com)からの応答をutf-8エンコーディングに変換する必要があります。

削られているページのhtmlコンテンツによると、今のところその「ISO-8859-1」です。したがって、次のようなことを行う必要があります。

require 'iconv'
doc = Nokogiri::HTML(Iconv.conv('utf-8//IGNORE', 'ISO-8859-1', open(link).read))

詳細については、こちらをご覧ください:http ://www.quarkruby.com/2009/9/22/rails-utf-8-and-html-screen-scraping

于 2010-04-04T08:21:07.093 に答える
1

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"
于 2019-12-15T18:24:23.887 に答える
0

相互参照を追加するために、このSOページにはいくつかの関連情報があります。

Nokogiriに、エンコードされていない/エンコードされていないHtmlエンティティをそのまま返すようにするにはどうすればよいですか?

于 2010-04-04T00:45:47.313 に答える
0

ヒント: Scrapifier gemを使用して、非常に簡単な方法でURIからメタデータをページタイトルとして取得することもできます。データはすべてUTF-8でエンコードされています。

それをチェックしてください:https ://github.com/tiagopog/scrapifier

お役に立てば幸いです。

于 2014-04-09T14:57:42.817 に答える