从HTML表中提取数据

时间:2013-06-15 01:01:01

标签: ruby nokogiri mechanize

我正在机械化宝石中学习Nokogiri,而我在找出用于从html表构建数组的正确选择器时遇到了麻烦。这是我从中提取数据所需的HTML表格:

<table id="propertysearchresults">
  <thead>…</thead>
  <tbody>
    <tr class="prototype_r">
      <td class="transparent">…</td>
      <td>...</td>
      <td> ITEM ONE </td>
      <td> ITEM TWO </td>
      <td class="location">…</td>
      <td> ITEM THREE </td>
      <td class="text_right">ITEM FOUR</td>
    </tr>
    <tr class="prototype_r">
      <td class="transparent">…</td>
      <td>...</td>
      <td> ITEM ONE </td>
      <td> ITEM TWO </td>
      <td class="location">…</td>
      <td> ITEM THREE </td>
      <td class="text_right">ITEM FOUR</td>
    </tr>
  </tbody>
</table>

我想为每行数据构建一到第四项的数组。如果有人可以帮助我的语法,我会很感激。感谢!!!

2 个答案:

答案 0 :(得分:1)

假设项目一/二/三/四总是在相同的td索引中,你可以这样做:

# Writing standalone; use Mechanize to fetch if you like
require 'nokogiri'
doc = Nokogiri.HTML( page_html )

data = doc.css('#propertysearchresults > tbody > tr').map do |row|
  row.elements.to_a.values_at(2,3,5,6).map(&:text)
end

p data
#=> [
#=>   [" ITEM ONE ", " ITEM TWO ", " ITEM THREE ", "ITEM FOUR"],
#=>   [" ITEM ONE ", " ITEM TWO ", " ITEM THREE ", "ITEM FOUR"]
#=> ] 

这使用CSS表达式来选择行,并为每个行查找子元素(<td>)作为数组,通过索引提取正确的元素,然后获取text每个

答案 1 :(得分:0)

Railscasts的这一集确实帮助了我做这些事情,因为他们展示了一个名为SelectorGadget的工具,它可以很容易地找出用于识别目标信息的css选择器。

Railscasts #190: Screen scraping with Nokogiri