как разобрать строку, только если одно из ее полей выделено жирным шрифтом?Нокогири и Руби - PullRequest
0 голосов
/ 22 июня 2011

, поэтому у меня есть этот код, который собирает всю необходимую информацию о продукте:

  # get main page
  page = agent.get "http://www.site.com.mx/tienda/index.php"

  search_form = page.forms.first

  search_result = agent.submit search_form

  doc = Nokogiri::HTML(search_result.body)

  rows = doc.css("table.articulos tr")

        i = 0
        details = rows.collect 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()']
          ].collect do |name, xpath|
            detail[name] = row.at_xpath(xpath).to_s.strip
          end
          i = i + 1
          detail
        end

Мне нужно собрать SKU, как в моем коде (в переменной), если существует только qty2.

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Измените логику выбора строк, чтобы получить только те строки, которые вы хотите. Обновление : получит строки, которые у do выделены жирным шрифтом в ячейке количества:

rows = doc.xpath('//table[@class="articulos"]/tr[td[5]/p/b]')

Обновление 2

Вот пример, показывающий, что это работает.

require 'nokogiri'

html = <<__html__
<html>
<table class="articulos">
<tr>
  <td>1</td>
  <td>2</td>
  <td>sku1</td>
  <td>4</td>
  <td>5</td>
  <td>6</td>
</tr>
<tr>
  <td>2-1</td>
  <td>2-2</td>
  <td>sku2</td>
  <td>2-4</td>
  <td><p><b>2-5</b></p></td>
  <td>2-6</td>
</tr>
</table>
</html>
__html__

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

Выход:

sku2
0 голосов
/ 22 июня 2011

Если я правильно понял ваш вопрос:

rows.collect{...}.reject{|detail| detail[:qty2].empty?}

или

rows.inject([]){ |details, row| ... ; detail[:qty2].empty? ? details : details.push(detail) }
...