2016-11-13 107 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> 

錶行均沒有class和id。此外,有不想要的<table>行包含這些類的單元格,但有些沒有值,所以我只需要獲得具有這三類單元格的錶行,以及具有非空值的所有三個單元格。我的語法不知道要做到這一點:

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

通常你會'select {| e | ...}'在元素'e'上有一些方法調用,這意味着什麼。例如,'e.html.match(/ \ S /)'至少要測試一個非空格字符。 – tadman

+0

我明白.select和迭代器在一般情況下是如何工作的,我只是不確定如何封裝邏輯以僅選擇包含非空單元格的表格行以及適當的類別 – TDB

+0

歡迎來到SO。當提出這樣的問題時,如果您提供了一個更好的示例,說明具有最小數據來展示問題的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

相關問題