我正在尝试从使用 JavaScript 的页面中抓取 URL。他们没有在页面上提供链接,而是为多个表行创建了
onClick
事件,这样,当您单击该行时,它会将您带到链接。
我尝试使用 Mechanize 抓取 URL:
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?
如果没有好的现成解决方案,那么最好的正则表达式是什么?我对正则表达式有点陌生,所以还不太能够自己整理一些东西。
您应该使用解析器。正则表达式和 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,您会发现使用 Nokogiri 内置的 CSS 支持非常容易上手。
还有,
n['onclick'][/\(['"]([^)]+)['"]\)/, 1]
也可以写成:
n['onclick'][/\(([^)]+)\)/, 1][1..-2]