Rai*_*ner 5 ruby ruby-on-rails mechanize
我对Mechanize有点麻烦.
当使用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
Run Code Online (Sandbox Code Playgroud)
响应:
<html>
<head>
<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=index.php?showpage=m_frontpage\">
</head>
</html>
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
redirect_url = page.parser.at('META[HTTP-EQUIV=\"Refresh\"]')[
"0;URL=index.php?showpage=m_frontpage\"][/url=(.+)/, 1]
Run Code Online (Sandbox Code Playgroud)
但我得到:
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/"
Run Code Online (Sandbox Code Playgroud)
doc.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1]分解为:查找属性为 的标签的atCSS 访问器的第一次出现 ( ) 。获取该标签的属性并返回后面的字符串。<meta>http-equivrefreshcontenturl=
这是一些典型用途的 Mechanize 代码。因为您没有提供示例代码来作为我的基础,所以您必须从此开始工作:
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)
Run Code Online (Sandbox Code Playgroud)
编辑:at('META[HTTP-EQUIV=\"Refresh\"]')
你的代码有上面的内容at()。请注意,您正在转义单引号字符串内的双引号。这会导致字符串中出现一个反斜杠,后跟一个双引号,这不是我的示例使用的,也是我对为什么会出现错误的第一个猜测。Nokogiri 找不到标签,因为没有<meta http-equiv=\"Refresh\"...>.
编辑:Mechanize 有一种内置的方法来处理元刷新,通过设置:
agent.follow_meta_refresh = true
Run Code Online (Sandbox Code Playgroud)
它还具有解析元标记并返回内容的方法。来自文档:
解析(内容,uri)
从元标记的内容属性中解析延迟和 url。当没有指定 url 时,Parse 需要当前页面的 uri 来推断 url。如果给出了一个块,则解析的延迟和 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4640 次 |
| 最近记录: |