【问题标题】:Puzzled by ror Mechanize被 ror 机械化迷惑了
【发布时间】:2009-12-08 04:12:07
【问题描述】:

我正在尝试使用 mechanize 对我大学的课程表数据库进行简单搜索。以下代码返回 nil,但它可以登录 facebook 并搜索 google(使用 diff url/params)。我做错了什么?

我正在关注最新的(很棒的)railscast here。机械化文档很有用,但我仍然感到困惑。提前感谢您的建议!

ruby script/console
require 'mechanize'
agent = WWW::Mechanize.new
agent.get("https://www.owens.edu/cgi-bin/class.pl/")
agent.page.forms
form = agent.page.forms.last
form.occ_subject = "chm"
form.submit.search
=> []

【问题讨论】:

    标签: ruby-on-rails ruby mechanize


    【解决方案1】:

    form.submit.searchform.submit 中删除搜索我猜您正在附加搜索以提交认为它与提交按钮的值有关,即搜索。

    你的代码正在做的是成功提交表单。但是,您使用 nil 参数调用结果页面对象的搜索方法。搜索方法需要一个选择器,例如'body div#nav_bar ul.links li' 作为参数,它返回与该选择器匹配的元素数组。当然没有元素会匹配一个 nil 选择器,因此是空数组。

    根据您的回复进行编辑:

    您的代码:

    ruby script/console
    require 'mechanize'
    agent = WWW::Mechanize.new
    agent.get("https://www.owens.edu/cgi-bin/class.pl/")
    agent.page.forms
    form = agent.page.forms.last
    form.occ_subject = "chm"
    form.submit.search
    => []
    

    我尝试过并开始工作:

    ruby 脚本/控制台

    require 'mechanize'
    agent = WWW::Mechanize.new
    agent.get("https://www.owens.edu/cgi-bin/class.pl")
    agent.page.forms
    form = agent.page.forms.last
    form.occ_subject = "chm"
    form.submit # <- No search method.
    => Insanely long array of HTML elements
    

    同样的代码也不适用于 Google:

    require 'mechanize'
    require 'nokogiri'
    agent = WWW::Mechanize.new
    agent.get("http://www.google.com")
    form = agent.page.forms.last
    form.q = "stackoverflow"
    a = form.submit.search
    b = form.submit
    puts a
    => [] # <--- EMPTY!
    
    puts b
    #<WWW::Mechanize::Page
     {url
      #<URI::HTTP:0x1020ea878 URL:http://www.google.co.uk/search?hl=en&source=hp&ie=ISO-8859-1&q=stackoverflow&meta=>}
     {meta}
     {title "stackoverflow - Google Search"}
     {iframes}
     {frames}
     {links
      #<WWW::Mechanize::Page::Link
       "Images"
       "http://images.google.co.uk/images?hl=en&source=hp&q=stackoverflow&um=1&ie=UTF-8&sa=N&tab=wi">
      #<WWW::Mechanize::Page::Link
       "Videos"
       …
    

    页面对象的搜索方法的行为类似于 Nokogiri 的搜索方法,因为它接受一系列 CSS 选择器和/或 XPath 查询并返回匹配元素的可枚举对象。例如

    page.search('h3.r a.l', '//h3/a[@class="l"]') 
    

    【讨论】:

    • 嗨。我不确定你是什么意思。上面的代码“=>[]”是指我输入提交后的返回值。你如何将参数传递给搜索?这段代码在没有参数的情况下适用于 facebook 和 google,为什么在这里需要它们?
    • 好的。我会暂时接受答案。然而,生成的“超长的 HTML 元素数组”只是重新生成的表单(在大学的情况下)。提交后返回的信息是=agent.page.forms。在浏览器中进行真正的搜索,搜索会产生大量的类列表,并且不同意此返回。我将 .search 添加到 form.submit 是因为我不确定我是否真的提交了表单,或者使用提交命令点击了清除按钮。显然,走错了路。机械化仍然没有返回任何有关欧文的有效信息。是https还是cgi?
    • 就个人而言,我认为这是网站特有的问题。我不确定这是否是一个 HTTPS 问题,尽管我怀疑这是否会是原因,因为 Mechanize 是打算这样使用的。不管怎样,你的问题让我很烦恼,所以我会更深入地研究一下,看看我是否能找到问题的根源。
    【解决方案2】:

    通过WWW::Mechanize查询页面返回null结果。

    我不确定 WWW::Mechanize 是否可以处理 POSTING 到这个安全页面。

    "can't convert nil into String" 意味着它不能以文本形式告诉你什么是空。它不能从无到有。

    也可能是表单和脚本延迟的问题。

    尝试使用 curl 进行调试,POSTing 如curl -d "occ_subject=chm" https://www.owens.edu/cgi-bin/class.pl,当我尝试它返回一个页面时。

    我认为是安全页面和cgi脚本结合的问题。

    【讨论】:

    • 使用 CURL POST 表单的正确方法是curl -d "occ_subject=chm" https://www.owens.edu/cgi-bin/class.pl
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多