【问题标题】:How do I scrape URLs from a JavaScript 'onclick window.open' event?如何从 JavaScript 'onclick window.open' 事件中抓取 URL?
【发布时间】:2012-12-11 06:39:43
【问题描述】:

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

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

【问题讨论】:

  • 所有链接的格式都一样吗?
  • 如果可能的话,也可以将 URL 添加到您正在抓取的页面,以便人们查看源代码。帮助您更快地获得答案。

标签: javascript ruby screen-scraping web-scraping mechanize


【解决方案1】:

您应该使用解析器。正则表达式和 HTML/XML 不能很好地混合,因为正则表达式不是为处理 HTML 和 XML 文档包含的不规则而设计的。非常简单的任务可能适用于模式,但您很快就会发现它们很脆弱,并且在 HTML 更改时很容易被破坏。

Mechanize for Ruby,在内部使用Nokogiri,这是获取这些参数的绝佳方式。您可以访问 Mechanize 的内部 Nokogiri 文档,并从中找到 &lt;tr&gt; 标签:

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]

【讨论】:

  • 太好了 - 搜索和映射工作完美。我是否应该将正则表达式解释如下:1)找到一个左括号 2)找到一个单引号或双引号 3)找到所有不是右括号的字符 4)找到一个右引号 5)找到一个右括号......?传入的 '1' 参数代表什么?谢谢!
  • 这就是阅读正则表达式的方法。 1 的含义留给您自己弄清楚。请参阅String.[] 的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
相关资源
最近更新 更多