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