我有一个具有以下语法的表:
<tbody>
<tr>
<td><a href=""></a></td>
<td></td>
<td></td>
</tr>
<tr>
<td><a href=""></a></td>
<td></td>
<td></td>
</tr>
......
</tbody>
我能够提取如下链接:
link = page.css('tbody tr td a')[1]['href']
但是,当我尝试在for
循环中执行此操作时,它失败了,并且我收到有关未定义方法"[]"的错误:
rows = page.css('tbody tr')
$numRows = rows.count
links = Array.new
(0..$numRows-1).each do |i|
links.push(page.css('tbody tr td a')[i]['href'])
我能够使用以下代码解决我的问题:
rows = page.css('tbody tr')
rows.shift
$num_updates = rows.count
puts rows.count
links = Array.new
page.css('tbody tr td a').each do |i|
links.push(i.attr('href'))
end
columns = Hash.new
(0..$num_updates-1).each do |i|
columns[i] = rows[i].text
columns[i] = columns[i].split("n")
end
您的i
循环<td>
标签的数量,但其中只有一个 tds 中有<a>
,因此('tbody tr td a')[1]
不存在。
冥想一下:
doc = Nokogiri::HTML::DocumentFragment.parse(<<EOT)
<tbody>
<tr>
<td><a href="foo"></a></td>
<td></td>
<td></td>
</tr>
<tr>
<td><a href="bar"></a></td>
<td></td>
<td></td>
</tr>
</tbody>
EOT
doc.search('a').map(&:to_html) # => ["<a href="foo"></a>", "<a href="bar"></a>"]
doc.search('a').map{ |n| n['href'] } # => ["foo", "bar"]
doc.search('a').map{ |n| n['href'] }[1] # => "bar"
或:
doc.search('a')[1]['href'] # => "bar"