无法在耙子任务中解析为Nokogiri



我是Nokogiri的新手,我正在尝试抓取百度的搜索结果。我写了一个简单的脚本来测试。它读取搜索关键字的第一页stackoverflow并输出文档的长度和第一页上的结果链接计数(应为10),它运行非常正确。

# coding: utf-8
require 'rubygems'
require 'nokogiri'
require 'open-uri'
url = 'http://www.baidu.com/s?wd=stackoverflow&pn=0'
parsed_uri = URI.parse(URI.escape(url))
read_uri = parsed_uri.read
puts "URI read length: #{read_uri.to_s.length}"
doc = Nokogiri::HTML(read_uri)
puts "Nokogiri document length: #{doc.to_s.length}"
puts "result link count: #{doc.css('h3.t a').count}"

结果输出:

$ ruby scrap_baidu.rb
URI read length: 37659
Nokogiri document length: 38226
result link count: 10

但是当我将其移动到新rails 3应用程序的耙子任务时:

require 'nokogiri'
require 'open-uri'
namespace :batch do
  desc "test"
  task :test_fetch => :environment do
    url = 'http://www.baidu.com/s?wd=stackoverflow&pn=0'
    parsed_uri = URI.parse(URI.escape(url))
    read_uri = parsed_uri.read
    puts "URI read length: #{read_uri.to_s.length}"
    doc = Nokogiri::HTML(read_uri)
    puts "Nokogiri document length: #{doc.to_s.length}"
    puts "result link count: #{doc.css('h3.t a').count}"
  end
end

我得到了完全不同的结果:

$ bundle exec rake batch:test_fetch
URI read length: 37964
Nokogiri document length: 11824
result link count: 0

文档长度完全不正确。看起来Nokogiri的行为有所不同。我不太确定.length是一种看到这一点的洞察力的方法,但这是我只有在发现差异时才能想到的。

为什么?

>Nokogiri 可以对 HTML 进行修正,使其能够合理地解析到它,还可以截断空白文本节点、插入回车符等。

例如:

irb(main):001:0> require 'nokogiri'
true
irb(main):002:0> html = '<html><head></head><body>foo</body></html>'
"<html><head></head><body>foo</body></html>"
irb(main):003:0> html.length
42
irb(main):004:0> Nokogiri::HTML(html).to_s.length
220
irb(main):005:0> Nokogiri::HTML(html).to_s
"<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">n<html>n<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>n<body>foo</body>n</html>n"
irb(main):006:0> html = '<html>     <head></head>     <body>foo</body></html>'
"<html>     <head></head>     <body>foo</body></html>"
irb(main):007:0> Nokogiri::HTML(html).to_s
"<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">n<html>n<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>n<body>foo</body>n</html>n"

您可以通过添加/调整解析选项来控制其解析行为。默认情况下,它使用 DEFAULT_HTML .

相关内容

  • 没有找到相关文章

最新更新