编程语言
首页 > 编程语言> > 如何从JavaScript“ onclick window.open”事件中抓取URL?

如何从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