Как мне интегрировать эти два кода блоков условий в майнинг на Ruby?

Как интегрировать эти два условия, если мой код очищается без них? Мой код уже работает, но он очищает все строки (значения, выделенные полужирным и полужирным шрифтом) и не очищает строку атрибута заголовка.


Условие 1: анализирует строку таблицы, только если одно из ее полей выделено полужирным шрифтом:

doc = Nokogiri::HTML(html)
doc.xpath('//table[@class="articulos"]/tr[td[5]/p/b]').each do |row|
puts row.at_xpath('td[3]/text()')
end

Условие2: получает только число из строки атрибута title :

doc     = Nokogiri::HTML(html)
numbers = doc.xpath('//p[@title]').collect { |p| p[:title].gsub(/[^\d]/, '') }

Мой код:

doc = Nokogiri::HTML(search_result.body)
rows = doc.css("table.articulos tr")
i = 0
details = rows.each do |row|
  detail = {}  
  [
    [:sku, 'td[3]/text()'],
    [:desc, 'td[4]/text()'],
    [:qty, 'td[5]/text()'],
    [:qty2, 'td[5]/p/b/text()'],
    [:price, 'td[6]/text()']
  ].each do |name, xpath|
    detail[name] = row.at_xpath(xpath).to_s.strip
  end
  i = i + 1
  detail
end

Вторая попытка:

  doc = Nokogiri::HTML(search_result.body)
  rows = doc.xpath('//table[@class="articulos"]/tr[td[5]/p/b]')
  i = 0
  details = rows.each do |row|
    detail = {}  
    [
      [:sku, 'td[3]/text()'],
      [:desc, 'td[4]/text()'],
      [:stock, "td[5]/p[@title]"],
      [:price, 'td[6]/text()']
    ].each do |name, xpath|
        detail[name] = row.at_xpath(xpath).to_s.strip

      end
    i = i + 1
    if detail[:sku] != ""
          price = detail[:price].split

          if price[1] == "D"
              currency = 144
          else
              currency = 168
          end
          stock = detail[:stock].gsub(/[^\d]/, '-')
          cost = price[0].gsub(",", "").to_f
  end

stock вместо того, чтобы просто очищать строку заголовка, он очищает весь абзац

<p-style="margin-top:-0px;-margin-bottom:0px;-cursor:hand"-title="2-en-su-sucursal"><b>10</b></p>

когда я хочу только 2 из атрибута title


person ingalcala    schedule 24.06.2011    source источник
comment
Я получаю синтаксическую ошибку для .collect   -  person ingalcala    schedule 24.06.2011


Ответы (2)


Вот моя непроверенная попытка исправить это:

doc = Nokogiri::HTML(search_result.body)
rows = doc.xpath('//table[@class="articulos"]/tr[td[5]/p/b]')
i = 0
details = rows.each do |row|
  detail = {}  
  [
    [:sku, 'td[3]/text()'],
    [:desc, 'td[4]/text()'],
    [:stock, 'td[5]/p[@title]'],
    [:price, 'td[6]/text()']
  ].each do |name, xpath|
    if name == :stock
      detail[name] = row.at_xpath(xpath).collect { |p| p[:title].gsub(/[^\d]/, '') }
    else
      detail[name] = row.at_xpath(xpath).to_s.strip
    end
  end
  i = i + 1
  detail
end
person sarnold    schedule 24.06.2011

Вот мой рабочий код. может быть, нужно немного очистки, но это работает. результаты правильные, но я получаю много нулей.

doc = Nokogiri::HTML(search_result.body)
rows = doc.xpath('//table[@class="articulos"]/tr[td[5]/p/b]')
i = 0
details = rows.each do |row|
  detail = {}  
  [
    [:sku, 'td[3]/text()'],
    [:desc, 'td[4]/text()'],
    [:stock, "td[5]/p/@title"],
    [:price, 'td[6]/text()']
  ].each do |name, xpath|
      detail[name] = row.at_xpath(xpath).to_s.strip
    end
  i = i + 1
  if detail[:sku] != ""
        price = detail[:price].split

        if price[1] == "D"
            currency = 144
        else
            currency = 168
        end
        stock = detail[:stock].each do |anchor|
                puts anchor['title']
                end
        stock1 = stock.gsub(/[^\d]/, '')
        cost = price[0].gsub(",", "").to_f
end
person ingalcala    schedule 24.06.2011