Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用Nokogiri解析表_Ruby_Xpath_Nokogiri - Fatal编程技术网

Ruby 使用Nokogiri解析表

Ruby 使用Nokogiri解析表,ruby,xpath,nokogiri,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 我拥有的一些表格中有如下行: &

我想用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
我拥有的一些表格中有如下行:

<tr>
  <td>
     Some text
  </td>
</tr>
简单:

doc.search('//td').each do |cell|
  puts cell.content
end
简单(但不干燥)的交替使用方法:

require 'nokogiri'

doc = Nokogiri::HTML <<ENDHTML
<body><table><thead><tr><td>NOT THIS</td></tr></thead><tr>
  <td>foo</td>
  <td><font>bar</font></td>
</tr></table></body>
ENDHTML

p doc.xpath( '//table/tr/td/text()|//table/tr/td/font/text()' )
#=> [#<Nokogiri::XML::Text:0x80428814 "foo">,
#=>  #<Nokogiri::XML::Text:0x804286fc "bar">]
需要“nokogiri”
doc=Nokogiri::HTML#]
请参阅以获得更为枯燥的答案

但是,在这种情况下,您可以简单地执行以下操作:

p doc.xpath( '//table/tr/td//text()' )
#=> [#<Nokogiri::XML::Text:0x80428814 "foo">,
#=>  #<Nokogiri::XML::Text:0x804286fc "bar">]
p doc.xpath('//table/tr/td//text()
#=> [#,
#=>  #]
请注意,没有显式
tbody
元素的表结构(以及上面我的表结构)对于XHTML无效。然而,考虑到上面明确的
表格>tr
,我认为您有这样做的理由。

使用

td//text()[normalize-space()]
这将选择当前节点的任何
td
子节点(代码中已选择的
tr
)的所有非空白文本节点子节点

或者,如果要选择所有文本节点子代,请重新标记它们是否仅为空白:

td//text()
更新

td//text()[normalize-space()]
OP在评论中表示,他收到了一个不需要的
td
,内容只是
 ;'(也称为不间断空格)

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

td//text()[translate(normalize-space(), '&#160;', '')]

如果有多个最里面的单元格呢?你只需要整个单元格的文本内容吗?事实上,是的。那太好了。嗨,迪米特里,你的解决方案对我有用。您能告诉我如何取消HTML字符串的显示吗?最好的方法是通过
cgi
模块吗?@Mridang Agarwalla:如果文本包含转义标记(非常糟糕的做法!),我建议重新解析此文本,然后将标记节点保存/输出为标记。在XSLT中,可以使用DOE(禁用输出转义)属性,但如果有其他解决方案,则应该避免这种做法。我想做的是将#&160等字符串转换为其标准形式。HTML标记非常好。谢谢。再次您好Dimitre,我对您之前提供的XPath有点问题。我正在尝试分析此页面。我在每一列后面都有一个额外的列,文本为- ;。你能帮我个忙吗?@Mridang Agarwalla:
normalize-space()
只删除只有空格的文本字符串, ;不是空格字符(在XPath术语中)。因此,请使用:
td//text()[规范化空间(翻译(,,,,,,,,,,))]
td//text()[translate(normalize-space(), '&#160;', '')]