Ruby从html中提取链接

时间:2012-03-26 19:45:35

标签: ruby nokogiri extraction

你好,这是我的剧本:

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

2 个答案:

答案 0 :(得分:4)

您可以使用CSS选择器a different way进行操作:

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

这将在doc中搜索所有锚点并将其href文本返回到数组中。

答案 1 :(得分:1)

Nokogiri将Strings始终作为UTF-8内部存储。返回文本值的方法将始终返回UTF-8编码的字符串。

您有冲突UTF-8和cp850(您正在使用Windows?)。 您可以调整File.read(input_filename)

尝试

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

如果您的html文件是Windows文件。

如果您的html文件已经是utf-8,请尝试:

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

另一种解决方案可能是代​​码开头的Encoding.default_external = 'utf-8'。 (我不推荐它,仅用于小脚本)。