Как перебрать таблицу и превратить строки в объекты с помощью nokogiri - PullRequest
1 голос
/ 12 июля 2009

Я хочу использовать nokogiri, чтобы пройтись по html и создать объект, соответствующий каждой строке. Я могу определить корневые xpath, из которых я хочу, чтобы данные заполняли переменные объекта, но я не знаю, как сгруппировать их как объект.

Мой код ниже. Я знаю, что это не работает, но я не знаю, в каком направлении идти, чтобы это работало.

требуется 'rubygems' требуется 'nokogiri'

doc = Nokogiri :: HTML.parse (<< - HTML_END) " LV1LV2LV3 MV1MV2MV3 NV1NV2NV3 " HTML_END </p>

класс пост инициализация по умолчанию (v1, v2, v3) @ v1 = v1 @ v2 = v2 @ v3 = v3 конец

  def v1= (v1)
    @v1 =v1
  end

  def v2
    @v2 =v2
  end

  def v3
    @v3 =v3
  end

конец

класс PostList инициализация по умолчанию @posts = Array.new конец

    def append(aPost)
      @posts.push(aPost)
      self
    end

    def deleteFirst
      @posts.shift
    end

    def deleteLast
      @posts.pop
    end

конец

list = PostList.new

parent = doc.css ('body'). First

получает контексты строки

parent.xpath ("// div / table [@ class = 'ipbtable'] / tr") .each do | a_tag |

k1 = "x" k2 = "х" k3 = "x"

a_tag.xpath ("td [1]"). Каждый делает | x_tag |

ставит x_tag.content

конец

list.append (Post.new (k1, k2, k3))

конец

1 Ответ

3 голосов
/ 12 июля 2009

Основная проблема с кодом, по-видимому, заключается в передаче строк ('K1', 'K2', 'K3'), которые неопределенно напоминают имена переменных, а не сами переменные (k1, k2, k3). Тем не менее, вы можете выразить это более кратко, как:

doc.search('table > tr').each do |row|
  properties = row.search('td/text()').collect {|text| text.to_s}
  list.append Post.new(*properties)
end

Это просто зацикливает каждую строку и создает сообщение, используя текстовое содержимое каждого тд в строке.

...