0

私はこれらのオブジェクトの人々と呼ばれる配列を持っています:

Nokogiri::XML::Text:0x3fe41985e69c "CEO, Company_1"
Nokogiri::XML::Text:0x3fe4194dab74 "COO, Company_2 "
Nokogiri::XML::Text:0x3fe4195eb414 "CFO, Company_3"

「」でオブジェクトを分割したいので、次のようなことを試みました。

companies = people.each do | company | 
  company.inner_text.match("/, (.*)/")
end

と:

occupations = people.each do | occupation | 
  occupation.inner_text.match("/(.*),/") 
end

matchオブジェクトから必要な値を抽出していないようです。rubular.comをチェックしましたが、機能するはずですが、入力したのと同じ文字列を取得して い"CEO, Company_1"ます。occupations = [CEO, COO, CFO]companies = [Company_1, Company_2, Company_3]

これらのオブジェクトを分割するにはどうすればよいですか?

4

1 に答える 1

2

なぜあなたsplitはテキストをしませんか?

require 'nokogiri'

xml = '<x>
<people>CEO, Company_1</people>
<people>COO, Company_2</people>
<people>CFO, Company_3</people>
</x>
'

doc = Nokogiri::XML(xml)
people = doc.search('people')
companies = people.map do |company| 
  company.text.split(',')
end

pp companies

=> [["CEO", " Company_1"], ["COO", " Company_2"], ["CFO", " Company_3"]]

会社の前に主要なスペースを取り除きたい場合は、以下を使用してください。

companies = people.map do |company| 
  company.text.split(/,\s*/)
end
=> [["CEO", "Company_1"], ["COO", "Company_2"], ["CFO", "Company_3"]]

または:

companies = people.map do |company| 
  company.text.split(',').map(&:lstrip)
end
=> [["CEO", "Company_1"], ["COO", "Company_2"], ["CFO", "Company_3"]]

または、map{ |s| s.sub(/^\s+/, '') }の代わりに使用しlstripます。

「スクレイピング時にノードからのすべてのテキストを結合しないようにする方法」も参照してください。

于 2013-02-08T14:53:03.013 に答える