如何仅选择内部具有特定内容的表行

时间:2016-11-13 01:42:11

标签: css ruby nokogiri

我正在抓取一个包含许多表行的电子邮件,其中一些我想要排除。我确实需要的表格行完全,如:

<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>行包含具有这些类的单元格但有些没有值,因此我只需要获得具有这三类单元格的表行,以及所有三个具有非空值的单元格。我不确定这样做的语法:

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

1 个答案:

答案 0 :(得分: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)是否包含除空白之外的其他内容。