0

不十分に構築されたソース サイトからコンテンツを csv 行に書き込もうとしています。私のcsv行は単純です:

COMPANY_NAME,WEBSITE,EMAIL,TEL1,TEL2,FAX,STREET,CITY,STATE,ZIP,COUNTRY

残念ながら、ソースには検索するためのクリーンな ID とクラスがありません。「私にとって役に立たない」要素の束の間には、次の<p>ように単一の要素内にまとめる必要があるすべてのものがあります。

<h2 class="lead">Contact Details</h2>
<br>
<p><!--what I want is in here -->
  <strong>COMPANY_NAME/strong> <br>
  STREET<br>
  CITY, STATE ZIP<br>
  COUNTRY<br>
  Tel: +1 555 555 5555<br>
  Tel: +1 555 555 5555<br>
  Fax: +1 555 555 5555<br>
  Email: <a href="mailto:EMAIL_ADDRESS</a><br>  
  URL: <a target="_blank" rel="nofollow" href="http://www.COMPANY_WEB_ADDRESS.com">
  www.COMPANY_WEB_ADDRESS.com</a><br>                 
</p>

だから、私の現在のコード(あなたは大笑いするだろうと確信しています)はこれです:

page = Nokogiri::HTML(open('http://www.SOURCE/'))
page.css('h2.lead')[0].next_element.next_element

この醜い行は、クラス リードを持つページ h2 要素の最初の発生を検出します。メソッドを適用するには、明示的に [0] を使用する必要がありましたか? 要素を間違ってキャプチャしましたか? 次に、<p>2 つの "next_element" 呼び出しを使用して、選択した要素の 2 つ後に要素を取得します。私はこれを書いてうんざりしましたが、選択後、n 番目のレベルをトラバースできなかったようです! 最後に、<p>私が望む要素とそのすべてのコンテンツがキャプチャされます! YAY ミニ勝利!

<p>出力は非常に醜く (私の 1 つのライナーが非常に醜いことは言うまでもありません) 、csv に出力できる配列にコンテンツを 「分割」する最善の方法がわかりません。

私はこれをそのままファイルに書き込んで、Linux ターミナルを使用してすべてをクリーンアップしたいと思っています。

どんな方向性でも大歓迎です。

4

1 に答える 1

2

次の方法で p を取得できます。

p = page.at('h2.lead + br + p')

内容を分割するには、おそらく次のようにすれば十分です。

p.children.map &:text
于 2013-06-07T00:44:22.853 に答える