我正在尝试从使用 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 更改时很容易损坏。
Ruby 的 Mechanize ,使用 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]
关于javascript - 如何从 JavaScript 'onclick window.open' 事件中抓取 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14028152/