Самый эффективный способ анализа и переформатирования данных с помощью Nokogiri & Sinatra - PullRequest
1 голос
/ 02 ноября 2010

Я работаю над переформатированием вывода HTML из поискового запроса для менеджера инвентаризации для ряда автодилеров. Нет прямого доступа к БД, нет информации от создателей сервиса, поэтому я решил попытаться проанализировать и переформатировать данные с помощью Nokogiri и создать новые страницы результатов на основе поискового запроса.

При первой загрузке страницы я просто использую поиск по умолчанию для генерации первых результатов.

Чтобы поиск работал, я отправляю запрос на URL-адрес, подобный следующему:

post '/search/?:search_query' do
  url = "http://domain.com/v/?DealerId=" + settings.dealer_id + "&maxrows=10&#{params[:search_query]}"
  doc = Nokogiri::HTML(open(url))
  doc.css("td:nth-child(5) .ForeColor4").each do |msrp|
    session["msrp"] = msrp.inner_html
  end  
  doc.css("td:nth-child(4) .ForeColor4").each do |price|
    session["price"] = price.inner_html
  end
  erb :index    
end

Я знаю, что должен быть разумный способ сделать это.

Edit:

Пример URL для запроса данных:

http://domain.com/?DealerId=1234&object=list&lang=en&MAKE=&MODEL=&maxrows=50&MinYear=&MaxYear=2011&Type=N&MinPrice=&MaxPrice=&STYLE=&ExtColor=&MaxMiles=&StockNo=

Описание сгенерированного HTML:

К сожалению, это старый код, который почти полностью основан на таблицах, имеет встроенные стили и не имеет классов или идентификаторов в большинстве областей.

Пример CSS-селектора:

td:nth-child(5) .ForeColor4

Селектор XPath:

//td[(((count(preceding-sibling::*) + 1) = 5) and parent::*)]//*[contains(concat( " ", @class, " " ), concat( " ", "ForeColor4", " " ))]

Я также рассматривал механизацию или hpricot как возможности, но я не знаю о лучших инструментах для этой работы, так как раньше я не пытался делать скриншоты.

Сводка : я хочу извлечь данные из HTML, временно сохранить их в переменной / session / cookie (данные меняются несколько раз в день), а затем иметь возможность переформатировать вывод в мой собственный стиль HTML / CSS.

Ответы [ 2 ]

1 голос
/ 02 ноября 2010

Лично я бы отделил откат от действий пользователя. У вас есть независимый процесс очистки и заполнения вашей базы данных. Это резко повысит производительность, так как выборка, создание DOM, разбор, затем рендеринг вывода при каждом действии будут медленными.

0 голосов
/ 02 ноября 2010
  doc.css("td:nth-child(5) .ForeColor4").each do |msrp|
    session["msrp"] = msrp.inner_html
  end  
  doc.css("td:nth-child(4) .ForeColor4").each do |price|
    session["price"] = price.inner_html
  end

Возможно, вы захотите использовать метод at_css() Нокогири вместо обычного css().at_css() находит первое вхождение вашей цели и возвращает только этот один узел, аналогично выполнению .first для набора узлов, который возвращает .css().

Это упростит поиск в этой форме:

session["msrp"] = doc.at_css("td:nth-child(5) .ForeColor4").inner_html

Я бы, вероятно, добавил что-то вроде rescue 'msrp lookup failed' во время тестирования в конце поисков на случай, если у вас плохие средства доступа.Или вы можете позволить сбою кода, когда inner_html() разозлился, пытаясь читать с нуля.Это просто более дружественный способ отладки.

В противном случае ваши поиски кажутся приличными.

...