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

Ни одна из строк таблицы не имеют класс или идентификатор. Более того, есть ненужные строки <table>, которые содержат ячейки с этими классами, но некоторые без значений, поэтому мне нужно получить только таблицы, у которых есть эти три класса ячеек, и все три ячейки с непустыми значениями. Я не уверен, синтаксиса, чтобы сделать это:

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

Обычно вы выбираете {| 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

Смежные вопросы