2012-03-26 11 views
1

Hallo hier ist mein Skript:Rubin Extrahieren Links von 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 

ich Schwierigkeiten Extrahieren Links aus einer Liste von HTML-Dateien habe. Ich glaube, das Problem ist auf unkonventionelle Codierung in einigen der HTML-Dateien zurückzuführen. Hier ist der Fehler, den ich bekomme.

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>' 

Antwort

1

Nokogiri speichert Strings immer als UTF-8 intern. Methoden, die Textwerte zurückgeben, geben immer UTF-8-codierte Strings zurück.

Sie haben einen Konflikt UTF-8 und CP850 (Sie arbeiten mit Windows?). können Sie passen Ihr File.read(input_filename)

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

Versuchen Wenn Ihre HTML-Dateien Windows-Dateien sind.

Wenn Ihre HTML-Dateien sind bereits utf-8, der Versuch:

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

kann eine andere Lösung ein Encoding.default_external = 'utf-8' am Beginn des Codes sein. (Ich würde es nicht empfehlen, verwenden Sie es nur für kleine Skripte).

+0

Vielen Dank für die detaillierte Erklärung. Ich schätze es sehr – user1290757

4

Sie können darüber gehen a different way den CSS-Selektor:

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

Dies würde die doc für alle Anker suchen und ihre href Text in einem Array zurück.