我正在尝试从使用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 举报,一经查实,本站将立刻删除。