2012-03-26 9 views
1

こんにちはからのリンクを抽出することは、私のスクリプトです:RubyはここにHTML

ARGV.each do |input_filename| 
    doc = Nokogiri::HTML(File.read(input_filename)) 
    title, body = doc.title.gsub("/\s+/"," ").downcase.strip, doc.xpath('//body').inner_text.tr('"', '').gsub("\n", '').downcase.strip 
    link = doc.search("a[@href]") //Adding this part generates errors 
    filename = File.basename(input_filename, ".*") 
    puts %Q("#{title}", "#{body}", "#{filename}", "#{link}").downcase 
end 

私はトラブルのhtmlファイルのリストからのリンクを抽出することが生じています。私はこの問題がhtmlファイルのいくつかの形式によらないコード化によるものだと考えています。ここに私が得るエラーがあります。

extractor.rb:9:in `block in <main>': incompatible character encodings: UTF-8 and CP850 (Encoding::CompatibilityError) 
     from extractor.rb:4:in `each' 
     from extractor.rb:4:in `<main>' 

答えて

1

Nokogiriは常に文字列を内部的にUTF-8として格納します。テキスト値を返すメソッドは、常にUTF-8でエンコードされた文字列を返します。

UTF-8とcp850が競合しています(ウィンドウで作業していますか?)。 あなたのhtml-ファイルは、Windowsのファイルである場合

File.read(input_filename, :encoding => 'cp850:utf-8') 

を試してみてください、あなたのFile.read(input_filename)

を適合させることができます。

あなたのhtml-ファイルがすでにUTF-8、試している場合:

File.read(input_filename, :encoding => 'utf-8') 

別の解決策は、あなたのコードの開始時Encoding.default_external = 'utf-8'かもしれません。 (私はそれをお勧めしません、小さなスクリプトのためだけに使用します)。

+0

詳細な説明ありがとうございます。ほんとうにありがとう – user1290757

4

あなたはCSSセレクタを使用してa different wayについて行くことができます。

doc.css('a').map { |link| link['href'] } 

これは、すべてのアンカーのためのドキュメントを検索し、配列にそのHREFテキストを返します。