如何从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]
标签:web-scraping,mechanize,screen-scraping,ruby,javascript 来源: https://codeday.me/bug/20191031/1976008.html