使用Nokogiri解析表

Mri*_*lla 3 ruby xpath nokogiri

我想用Nokogiri解析一张桌子.我是这样做的

def parse_table_nokogiri(html)

    doc = Nokogiri::HTML(html)

    doc.search('table > tr').each do |row|
        row.search('td/font/text()').each do |col|
            p col.to_s
        end
    end

end
Run Code Online (Sandbox Code Playgroud)

我有一些表有这样的行:

<tr>
  <td>
     Some text
  </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

......有些人有这个.

<tr>
  <td>
     <font> Some text </font>
  </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

我的XPath表达式适用于第二种情况,但不适用于第一种情况.是否有一个我可以使用的XPath表达式,它将从单元格的最内层节点给我文本,以便我可以处理这两种情况?


我已将更改合并到我的代码段中

def parse_table_nokogiri(html)

    doc = Nokogiri::HTML(html)
    table = doc.xpath('//table').max_by {|table| table.xpath('.//tr').length}

    rows = table.search('tr')[1..-1]
    rows.each do |row|

        cells = row.search('td//text()').collect {|text| CGI.unescapeHTML(text.to_s.strip)}
        cells.each do |col|

            puts col
            puts "_____________"

        end

    end

end
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 6

用途:

td//text()[normalize-space()]
Run Code Online (Sandbox Code Playgroud)

这将选择td当前节点的任何子节点(tr已在代码中选择)的所有非空白空间文本节点后代.

或者,如果要选择所有文本节点后代,请考虑它们是否仅为空白空间:

td//text()
Run Code Online (Sandbox Code Playgroud)

更新:

OP在一条评论中发出信号称他正在获得一个不受欢迎td的内容,只是一个'&#160;'(也就是不间断的空间).

要排除td其内容仅由(一个或多个)字符组成的s,请使用:

td//text()[translate(normalize-space(), '&#160;', '')]
Run Code Online (Sandbox Code Playgroud)