2016-11-13 7 views
0

いくつかのテーブル行を除外する電子メールを削っています。私はテーブルの行は正確にを見てなどの必要があります。テーブルの行の特定の内容のテーブル行のみを選択する方法

<tr> 
    <td class="quantity"> ANYTHING BUT EMPTY </td> 
    <td class="description"> ANYTHING BUT EMPTY </td> 
    <td class="price"> ANYTHING BUT EMPTY </td> 
</tr> 

なしクラスまたはIDを持っていません。さらに、これらのクラスのセルを含む不要な値のある<table>行がありますが、値のないものもあります。したがって、これらの3つのクラスのセルと3つのセルすべてが空でない値を持つテーブル行のみを取得する必要があります。私はこれを行うには、構文のか分からない:

body = Nokogiri::HTML(email) 
wanted_rows = body.css('tr').select{ NOT SURE HOW TO ENCAPSULATE LOGIC HERE } 
+0

通常、 '{{e | ...} 'どこに何かを意味するあなたの要素' e'のメソッド呼び出しがあります。たとえば、少なくとも1つの空白以外の文字をテストするには、 'e.html.match(/ \ S /)'のようにします。 – tadman

+0

一般的な選択とイテレータの仕組みを理解していますが、空でないセルを含むテーブル行を選択するためのロジックをカプセル化する方法がわかりません。 – TDB

+0

ようこそ。このような質問をすると、データを含む2行とそうでない1行など、問題を示す最小限のデータを持つHTMLのより良い例を提供すると助けになります。 "[mcve]"はこれについて語ります。あなたが私たちを手伝ってくれるほど、より速く私たちがあなたを助けることができ、質問とデータがより正確になればなるほど、私たちはより正確になります。それはあなたが他の言葉で私たちを助けるのに役立ちます。入力を調整するために余分な作業を行うことはできますが、それは私たちを遅らせ、実際には助けを失います。 –

答えて

1

これは、XPathと非常に簡単です:

wanted_rows = body.xpath('//tr[td[(@class = "quantity") and normalize-space()] 
    and td[(@class = "description") and normalize-space()] 
    and td[(@class = "price") and normalize-space()]]') 

彼らは現在のノードいることを確認します。すなわちnormalize-space()呼び出しは、効果的にnormalize-space(.) != ""と同じです(td)には空白以外のものが含まれています。

+0

はい!本当にありがとう。ちょうどそれを試して、それは動作します。今XPathで読む時間... – TDB

関連する問題