javascript - 如何从 JavaScript 'onclick window.open' 事件中抓取 URL?

标签 javascript ruby screen-scraping web-scraping mechanize

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

相关文章:

ruby - 即使将命令作为登录 shell 运行,RVM 也不是一个函数

ruby-on-rails - 混合 redis actioncontroller::live - rails 应用程序

python - 使用 BS4 python 进行抓取

api - 用于从文章 url 中提取文本的 Web API?

java - JSOUP 登录然后解析并在 HTML 字符串中查找价格

javascript - 未检索到输入字段的值 : undefined object

javascript - 插入填充以补偿 "scrollbar jump"

javascript - 使用 jquery 动态添加的 css 打印 html 表

javascript - 使用 JS 查找和比较顺序 div

ruby - 是否有 ruby​​ 方法可以在其他字符串之间选择字符串?