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)
用途:
td//text()[normalize-space()]
Run Code Online (Sandbox Code Playgroud)
这将选择td
当前节点的任何子节点(tr
已在代码中选择)的所有非空白空间文本节点后代.
或者,如果要选择所有文本节点后代,请考虑它们是否仅为空白空间:
td//text()
Run Code Online (Sandbox Code Playgroud)
更新:
OP在一条评论中发出信号称他正在获得一个不受欢迎td
的内容,只是一个' '
(也就是不间断的空间).
要排除td
其内容仅由(一个或多个)字符组成的s,请使用:
td//text()[translate(normalize-space(), ' ', '')]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6387 次 |
最近记录: |