2

ruby で nokogiri を使用して Web サイトを parising するのに少し問題があります。

サイトはこんな感じ

<div id="post_message_111112" class="postcontent">

        Hee is text 1 
     here is another
      </div>
<div id="post_message_111111" class="postcontent">

            Here is text 2
    </div>

ここにそれを解析するための私のコードがあります

 doc = Nokogiri::HTML(open(myNewLink))
 myPost = doc.xpath("//div[@class='postcontent']/text()").to_a()

ii=0

 while ii!=myPost.length
     puts "#{ii}  #{myPost[ii].to_s().strip}"
   ii+=1
 end

私の問題は、それが表示されるときですHee is text 1.to_aの後の新しい行のために、

myPost[0] = hee is text 1
myPost[1] = here is another
myPost[2] = here is text 2

各 div を独自のメッセージにしたい。お気に入り

myPost[0] = hee is text 1 here is another
myPost[1] = here is text 2

どうすればこれを解決できますか

更新しました

私は試した

 myPost = doc.xpath("//div[@class='postcontent']/text()").to_a()

myPost.each_with_index do |post, index|
  puts "#{index}  #{post.to_s().gsub(/\n/, ' ').strip}"
end

post.to_s().gsub を入れたのは、gsub が post のメソッドではないことに不満を持っていたからです。しかし、私はまだ同じ問題を抱えています。私は自分の頭を壊すだけで間違ったことをしていることを知っています

更新 2

<br />新しい行があると言うのを忘れていました

   doc.search('br').each do |n|
  n.replace('')
end

また

doc.search('br').remove

問題はまだある

4

2 に答える 2

0

ここで、それをクリーンアップしましょう。

doc.search('div.postcontent').each_with_index do |div, i|
  puts "#{i} #{div.text.gsub(/\s+/, ' ').strip}"
end
# 0 Hee is text 1 here is another
# 1 Here is text 2
于 2013-03-10T23:13:37.180 に答える
0

配列を見るmyPostと、各 div が実際には独自のメッセージであることがわかります。最初のものにはたまたま newline-character が含まれています\n。スペースに置き換えるには、 を使用します#gsub(/\n/, ' ')。したがって、ループは次のようになります。

myPost.each_with_index do |post, index|
    puts "#{index}  #{post.to_s.gsub(/\n/, ' ').strip}"
end

編集:

私の限られた理解によると、xpathはノードしか見つけることができません。子ノードは<br />であるため、それらの間に複数のテキストがあるか、divタグが検索に含まれています。ノード間のテキストを結合する方法は確かにありますが<br />、私にはわかりません。あなたがそれを見つけるまで、ここでうまくいくもの:

  1. あなたのxpathマッチを"//div[@class='postcontent']"

  2. div タグを削除するようにループを調整します。

    myPost.each_with_index do |post, index|
         post = post.to_s
         post.gsub!(/\n/, ' ')
         post.gsub!(/^<div[^>]*>/, '') # delete opening div tag
         post.gsub!(%r|</\s*div[^>]*>|, '') # delete closing div tag
         puts "#{index}  #{post.strip}"
    end
    
于 2013-03-10T17:36:22.303 に答える