1

ノコギリ初心者で、バイドゥの検索結果をスクレイピングしようとしています。テストする簡単なスクリプトを作成します。検索キーワードの最初のページを読み取り、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 アプリの rake タスクに移動すると:

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が、これは違いを見つけたときにしか考えられなかったものです.

何故ですか?

4

1 に答える 1

0

Nokogiri は、HTML を適切に解析できるように 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

于 2012-04-23T19:15:59.133 に答える