微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从JavaScript“ onclick window.open”事件中抓取URL?

我正在尝试从使用JavaScript页面抓取URL.他们没有在页面链接,而是为许多表行创建了onClick事件,因此,当您单击该行时,它将带您到链接.

我尝试使用Mechanize抓取网址:

agent = Mechanize.new
page = agent.get(url)

page.links_with(:href => /^http?/).each do |link|
  puts link.href
end

但是,通过HREF引用查找链接在这里行不通,因为它们在页面上是onClick事件的一部分:

<tr onclick="window.open('/someurl');">

是否有使用Mechanize或其他一些gem解析页面代码提取onClick事件中嵌入的URL的好方法

如果没有好的即用型解决方案,那么最好的正则表达式呢?我是regex的新手,所以还不能完全靠自己整理一些东西.

解决方法:

您应该使用解析器.正则表达式和HTML / XML不能很好地融合在一起,因为正则表达式的设计目的不是处理HTML和XML文档中包含的不规则性.非常简单的任务可能适用于某种模式,但是当HTML更改时,您会很快发现它们很脆弱并且很容易损坏.

Mechanize for Ruby在内部使用Nokogiri,这是获取这些参数的绝佳方法.您可以访问Mechanize的内部Nokogiri文档,并从中找到< tr>.标签

require 'mechanize'

page = Mechanize.new
page = agent.get('http://somesite.foo.com')

page.search('tr[onclick]').map{ |n| n['onclick'][/\(['"]([^)]+)['"]\)/, 1] }

如果我直接使用Nokogiri来解析此片段:

<tr onclick="window.open('/someurl');">

我可以做这个:

require 'nokogiri'

page = Nokogiri::HTML(%[<tr onclick="window.open('/someurl');">])
page.search('tr[onclick]').map{ |n| n['onclick'][/\(['"]([^)]+)['"]\)/, 1] }
=> ["/someurl"]

请注意,我正在使用CSS访问器’tr [onclick]’进行搜索,这使得查找特定节点非常容易.如果您知道JavaScript,CSS或jQuery,您会发现使用其内置的CSS支持可以轻松选择Nokogiri.

也,

n['onclick'][/\(['"]([^)]+)['"]\)/, 1]

可以这样写:

n['onclick'][/\(([^)]+)\)/, 1][1..-2]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐