2

私は次のルビースクリプトを持っています:

require "rubygems"
require "rest-client" #although not required in the program
require "open-uri"
require "nokogiri"


puts "Opening file"
page=File.open("file.html","r"){|file| file.read}
puts page
    page = Nokogiri::HTML(page)
    puts page.class
    #Filters content of page to select all references to the documents filing date
    td_rows = page.css('td i.blue')
    puts td_rows

このスクリプトはCodeRunnerまたはTextWranglerから実行し、ruby'filename'を使用してターミナルから呼び出すことができます。しかし、ある時点でスクリプトを実行しようとして、Keyboard MaestroまたはPlatypusを使用してスクリプトを呼び出そうとしましたが、実行されても行が完了していないようです。

td_rows = page.css('td i.blue')

変数td_rowsには何も含まれていません。なぜこれが機能しないのか誰かが知っていますか?

どうもありがとう

4

2 に答える 2

0

コードがファイルを読み取れない場合でも、Nokogiriは、空の文字列を解析しようとしたときに空のHTMLドキュメントを作成します。

[2] (pry) main: 0> Nokogiri::HTML('')
=> #(Document:0x245962c {
  name = "document",
  children = [ #(DTD:0x24ab210 { name = "html" })]
  })
[3] (pry) main: 0> Nokogiri::HTML('').to_html
=> "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n\n"

そして、その時点で、そのクラスを見ると、Nokogiri::HTMLドキュメントが得られます。

[4] (pry) main: 0> Nokogiri::HTML('').class
=> Nokogiri::HTML::Document

したがって、クラス名をチェックしてputs page.classも何の役にも立ちません。そして、セルを探すと空になります。

[3] (pry) main: 0> Nokogiri::HTML('').css('td i.blue')
=> []

個人的に、ドキュメントを読んだかどうかを知りたい場合は、文字がないかどうかを確認してください。

abort("Got nothing") if page.empty?

コンテンツを印刷したり、document.classを確認したりする代わりに。

また、page = File.read('file.html')の代わりに使用しますがFile.open、それは私だけです。

これはすべて、ファイルが見つからないか、ファイルが空であることを示しています。File.exists?('file.html')続行する前に、その存在を探したり、File.size('file.html')内容が含まれているかどうかを確認したりするようなものを使用できます。

于 2012-08-06T17:51:26.350 に答える
0

nokogiriparseが機能しなかった理由をなんとか見つけました。

何らかの理由で、ページをWebから開いた場合、スクリプトは機能しますが、Webページを最初にディスクに保存してから開いた場合は、機能しませんでした。ページをディスクから開くと、nokogiriエラーが発生し、ファイルの最初の数行のみを読み取って解析したことがわかりました。このエラーは、同じ行ではなく後続の行でHTMLコメントが閉じられていないことが原因でした。

「r」だけでなく「rb」モードでファイルを読み取ることで、この問題を克服することができました。つまり、file.open行を次のように置き換えた場合:

page=File.open("file.html","rb"){|file| file.read}

nokogiriはファイルを正しく解析します。

于 2012-09-10T16:43:38.460 に答える