• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

机械化 – 如何关注或“点击”导轨中的元刷新

ruby-on-rails 来源:Rails beginner 9次浏览

机械化有点麻烦。机械化 – 如何关注或“点击”导轨中的元刷新

使用Mechanize提交表单时。我来到一个元刷新页面,没有链接。

我的问题是我如何遵循元刷新?

我试图让元刷新,但然后我得到一个套接字错误。 示例代码

require 'mechanize' 
agent = WWW::Mechanize.new 
agent.get("http://euroads.dk") 
form = agent.page.forms.first 
form.username = "username" 
form.password = "password" 
form.submit 
page = agent.get("http://www.euroads.dk/system/index.php?showpage=login") 
agent.page.body 

响应:

<html> 
<head> 
    <META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=index.php?showpage=m_frontpage\"> 
</head> 
</html> 

然后我尝试:

redirect_url = page.parser.at('META[HTTP-EQUIV=\"Refresh\"]')[ 
    "0;URL=index.php?showpage=m_frontpage\"][/url=(.+)/, 1] 

,但我得到:

 
NoMethodError: Undefined method '[]' for nil:NilClass 


===========解决方案如下:

在内部,Mechanize使用Nokogiri来处理将HTML解析为DOM。您可以在Nokogiri文档中获得,以便您可以使用XPath或CSS访问器在返回的页面中进行挖掘。

这是如何仅引入nokogiri得到重定向URL:

require 'nokogiri' 

html = <<EOT 
<html> 
    <head> 
    <meta http-equiv="refresh" content="2;url=http://www.example.com/"> 
    </meta> 
    </head> 
    <body> 
    foo 
    </body> 
</html> 
EOT 

doc = Nokogiri::HTML(html) 
redirect_url = doc.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1] 
redirect_url # => "http://www.example.com/" 

doc.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1]分解为:查找CSS访问为<meta>标签与refreshhttp-equiv属性的第一次出现(at)。取该标记的content属性并返回url=后面的字符串。

这是典型使用的一些机械化代码。因为你没有给出示例代码,你的基础矿井必须先从这方面的工作:

agent = Mechanize.new 
page = agent.get('http://www.examples.com/') 
redirect_url = page.parser.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1] 
page = agent.get(redirect_url) 

编辑:at('META[HTTP-EQUIV=\"Refresh\"]')

您的代码具有上述at()。请注意,您正在使用单引号字符串转义双引号。这会导致一个反斜杠,然后在字符串中加双引号,这不是我样本使用的内容,而且是我为什么会得到错误的第一个猜测。 Nokogiri找不到标签,因为没有<meta http-equiv=\"Refresh\"...>

编辑:机械化有一个内置的方式通过设置来处理元刷新,:

agent.follow_meta_refresh = true 

它还具有parse the meta tag的方法和返回的内容。从文档:

解析(内容,URI)

分析从meta标签的内容属性的延迟和网址。当没有指定网址时,Parse需要当前页面的URI来推断网址。如果给出了一个块,解析后的延迟和url将被传递给它进行进一步处理。 如果无法解析延迟和url,则返回nil。

# <meta http-equiv="refresh" content="5;url=http://example.com/" /> 
uri = URI.parse('http://current.com/') 

Meta.parse("5;url=http://example.com/", uri) # => ['5', 'http://example.com/'] 
Meta.parse("5;url=", uri)      # => ['5', 'http://current.com/'] 
Meta.parse("5", uri)       # => ['5', 'http://current.com/'] 
Meta.parse("invalid content", uri)   # => nil 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)