0

わかりました。必要なのは少し奇妙で、次のようになります。

手がかり配列は手動で作成され、データ配列は動的に作成されます。Xpath関数は、手がかりを入力として受け取り、結果をデータにマップして動的配列を作成します

clues = Array.new

clues << 'Power supply type'    
clues << 'Slots'
clues << 'Software included'

selector = "//td[text()='%s']/following-sibling::td"

data = Array.new
data = clues.map do |clue| 
         xpath = selector % clue
         [clue, doc.at(xpath).text.strip]
       end

データ配列のコードは、2つの入力、手がかりとセレクターを使用し
ます。手がかり[インデックス]のすべてのアイテムは、%sでセレクターに入ります。

//td[text()='%s']/following-sibling::td  
//td[text()='Power supply type']/following-sibling::td
//td[text()='Slots']/following-sibling::td
//td[text()='Software included']/following-sibling::td

次に、Xpathがオフになり、保存されたコマンドを使用してWebページから情報を取得します。これらはすべて、配列データの要素としてdata [0] ...data[3]として保存されます。

Data [2]はこのように見えます、情報の大きな塊

Symantec Norton Internet Security (60 days live update); Recovery partition (inc
luding possibility to recover system; applications and drivers separately); Opti
onal re-allocation of recovery partition;

ここにリストされているソフトウェアの各部分を取り出して、それ自体で保存したいと思います。

data[2]Symantec Norton Internet Security (60 days live update); 
data[3]Recovery partition (including possibility to recover system; 
data[4]Optional re-allocation of recovery partition;

では、どういうわけかdata [2]を分割して、データ配列に追加し直す必要があると思いますか?

スプレッドシートへの最終出力のために複数行で必要になるため、この特定のインデックスを分離しようとしています

最終的な望ましい出力

ここに画像の説明を入力してください

4

3 に答える 3

2

明確にするために、次のような配列があります。

data << 'Power supply type'
data << 'Slots'
data << 'Symantec Norton Internet Security (60 days live update); Recovery partition (inc luding possibility to recover system; applications and drivers separately); Optional re-allocation of recovery partition;'
data << 'Something else'

そして、あなたはそれがこれになりたいですか?

data << 'Power supply type'
data << 'Slots'
data << Symantec Norton Internet Security (60 days live update);
data << Recovery partition (inc luding possibility to recover system;
data << applications and drivers separately);
data << Optional re-allocation of recovery partition;
data << 'Something else'

これを行うには、次のようにします。

temp = []
data[2].split(/(;)/).each_slice(2){ |s| temp << s.join.strip }
data[2] = temp
data.flatten!

または、データ配列内のすべてのアイテムを反復処理する場合は、次のようにします。

data.each_with_index do |x, i|
  temp = []
  data[i].split(/(;)/).each_slice(2){ |s| temp << s.join.strip }
  data[i] = temp
end
data.flatten!

基本的に何が起こっているのかというと、文字列を取得し、それを「;」で分割し、「;」を再挿入します。削除された場所で、データ配列の元のスポットを分割文字列の配列に置き換えてから、データ配列全体を1つの配列にフラット化します。

于 2012-08-04T12:53:07.503 に答える
0
data = Array.new
clues.each do |clue|
  xpath = selector % clue
  text = doc.at(xpath).text.strip
  if clue == 'Software included'
    values = text.scan(/.+?;/)
    values << text if values.empty? # text did not contain a semicolon
    data << [clue, values.shift.strip]
    values.each do |value|
      data << ['', value.strip]
    end
  else
    data << [clue, text]
  end
end

出力(読みやすくするためにインデントされています):

[
  ["Power supply type", "400w"],
  ["Slots", "2"],
  ["Software included", "Symantec Norton Internet Security (60 days live update);"],
  ["", "Recovery partition (including possibility to recover system;"],
  ["", "applications and drivers separately);"],
  ["", "Optional re-allocation of recovery partition;"]
]
于 2012-08-04T15:44:44.670 に答える
0
data = data[0..1] + data[2].scan(/.*?;/) + data[3..-1]
于 2012-08-05T01:21:34.953 に答える