3

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

如果没有好的开箱即用解决方案,那么最好的正则表达式可能是什么?我对正则表达式有点陌生,所以还不能自己拼凑一些东西。

4

1 回答 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]
于 2012-12-25T07:05:29.247 回答