-2

配列内の各div要素IDを取得し、要素サブクラスtheTextに必要な特定の文字列を含める方法。

<div id="corporaContainer" class="fullList">
  <div id="c-ff7c1098-8183-4c89-b3ec-b2587aa6d372" class="resItem clearfix">
    <div class="resTitle">
      <span id="filter-ready" class="statBall statFile ready" title="Status: ready"></span>
      <span class="theText"></span>
    </div>
  <div class="resType"></div>
  <div class="resSize"></div>
  <div class="resPermission public"></div> 
  <div class="resDomain"></div>
  <div class="resDescr"></div>
  <div class="resDetails clearfix" style="display:none;"></div>

各IDをループする配列を作成し、.includeを確認しようとしましたか?働き。しかし、これまでのところ成功していません。

各div要素をジャンプして、必要な文字列が含まれているかどうかを確認し、後でこのIDを使用するために、要素のID値を配列に格納するスクリプトが必要です。

これまでに作成したスクリプトコードを追加しました。

@b = Watir::Browser.new :chrome, :switches => %w[--disable-plugins --ignore-certificate-errors --disable-popup-blocking --disable-translate --disable-translate]
#-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
require_relative "1_login.rb"

# Ieiet Corpora sadaļā
@b.div(:id, "pageHeader").link(:text, "Corpora").click

lietotajs = @b.div(:class, "userRealName").text
dzesamie_korpusi = @b.div(:id, "corporaContainer", :class => "fullList")


korpusu_id = []
dzesamie_korpusi.each do |korpuss|
    id = korpuss.attribute_value "id"
    id = id[-38..-1]
    korpusu_id.push(id)
end

これまで、スクリプトがcorporacontainerの下の各DIV要素を介してループし、配列にirを格納するためにdiv要素IDを取得することを試みましたが、この正確なコードは、ハッシュタグまたはそれを今どうするかを期待しているようなエラーを返します。

4

2 に答える 2

0

の子孫ノードを含むすべての子ノードのルートdivを探していることを理解しました。そして、それらの子ノードを取得したいとします。そのために、HTML / XML/CSSドキュメントを解析するものを使用します。id=corporaContainerdivspanclass="theText"iddivnokogiri

file.html

<div id="corporaContainer" class="fullList">
  <div id="c-ff7c1098-8183-4c89-b3ec-b2587aa6d372" class="resItem clearfix">
    <div class="resTitle">
      <span id="filter-ready" class="statBall statFile ready" title="Status: ready"></span>
      <span class="theText"></span>
    </div>
    <div class="resType"></div>
  <div class="resSize"></div>
  <div class="resPermission public"></div>
  <div class="resDomain"></div>
  <div class="resDescr"></div>
  <div class="resDetails clearfix" style="display:none;"></div>
  </div>
  <div id="c-e5f0fe33-06a0-4685-8fe2-f789893bd8e2" class="resItem>clearfix"></div>
</div>

スクリプト

require 'nokogiri'

root_id = 'corporaContainer'
filter = 'theText'

File.open('file.html') do |file|
  nodes = Nokogiri::HTML(file)

  nodes.xpath("//div[@id=\"#{root_id}\"]/div").each do |node|
    puts node['id'] unless node.xpath(".//span[@class=\"#{filter}\"]").empty?
  end
end

その結果、あなたはあなたが探しているIDを持っています

c-ff7c1098-8183-4c89-b3ec-b2587aa6d372
于 2013-03-27T09:41:05.693 に答える
0

「文字列」と言うとき、この既知のテキストがどこに表示されるかは少し不明確です。divのどこかにあるテキストを探している場合(ページに(通常)表示されている「text」に注意してください。要素定義内の文字や要素の属性の値ではありません)

browser.div(:id => "corporaContainer").divs(:text => /TestAuto\s.*/).each do |div|
  puts div.attribute_value("id")
end

既知のものが属性の値であり、属性名が定数である場合、スパンのクラスのようなものであり、スパンは常に、必要なIDを持つコンテナオブジェクトの下の予測可能なレベルのコンテナオブジェクト内にネストされます。このように動作する可能性があります(テストする簡単な方法がないので、自分で試して、必要なものが得られるかどうかを確認してください)

browser.div(:id => "corporaContainer").spans(:class => /TestAuto\s.*/).each do |span|
  puts span.parent.parent.attribute_value("id")
end
于 2013-03-27T16:48:15.583 に答える