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

onClickただし、HREF参照を介してリンクを検索することは、イベントの一部としてページ上にあるため、ここでは機能しません。

<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 を知っている場合は、組み込みの CSS サポートを使用して Nokogiri を簡単に理解できることがわかります。

また、

n['onclick'][/\(['"]([^)]+)['"]\)/, 1]

代わりに次のように書くこともできます:

n['onclick'][/\(([^)]+)\)/, 1][1..-2]
于 2012-12-25T07:05:29.247 に答える