如何从 JavaScript“onclick window.open”事件中抓取 URL?

问题描述 投票:0回答:1

我正在尝试从使用 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?

如果没有好的现成解决方案,那么最好的正则表达式是什么?我对正则表达式有点陌生,所以还不太能够自己整理一些东西。

javascript ruby web-scraping mechanize
1个回答
4
投票

您应该使用解析器。正则表达式和 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]
© www.soinside.com 2019 - 2024. All rights reserved.