for循环中的Href解析问题

时间:2016-01-28 20:02:27

标签: html ruby parsing nokogiri

我有一个包含以下语法的表:

<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

2 个答案:

答案 0 :(得分:0)

i<td>代码的<a>个循环,但只有一个的tds中有('tbody tr td a')[1]个,{{1}}不存在。

答案 1 :(得分:0)

默想:

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"