ruby - How to iterate through browsenodes returned via amazon-ecs gem item lookup call? -
i writing internal application monitor our amazon listed products , stuck amazon product advertising api (amazon-ecs) ruby gem. display on screen browse nodes similar this:
"root category" -> sub categories -> final category (the actual category item in)
<browsenode> <browsenodeid>770071031</browsenodeid> <name>robotic vacuums</name> <ancestors> <browsenode> <browsenodeid>125698031</browsenodeid> <name>vacuums</name> <ancestors> <browsenode> <browsenodeid>3147711</browsenodeid> <name>vacuums & floor care</name> <ancestors> <browsenode> <browsenodeid>3576359031</browsenodeid> <name>vacuuming, cleaning & ironing</name> <ancestors> <browsenode> <browsenodeid>391784011</browsenodeid> <name>kitchen & home appliances</name> <ancestors> <browsenode> <browsenodeid>3147411</browsenodeid> <name>categories</name> <iscategoryroot>1</iscategoryroot> <ancestors> <browsenode> <browsenodeid>11052681</browsenodeid> <name>kitchen & home</name> <ancestors> <browsenode> <browsenodeid>11052591</browsenodeid> <name>home & garden</name> <ancestors> <browsenode> <browsenodeid>3146281</browsenodeid> <name>home & garden</name> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> so above should displayed as:
home & garden -> kitchen & home -> kitchen & home appliances -> vacuuming, cleaning & ironing -> vacuums & floor care -> vacuums
i have tried get_array, , get_hash these return value of 1 long string.
is there way want using amazon-ecs gem or should process string xml , try loop though accordingly?
this simple way there. without criteria showing how determine <name> nodes acceptable returns them all:
require 'nokogiri' xml = <<eot <browsenode> <browsenodeid>770071031</browsenodeid> <name>robotic vacuums</name> <ancestors> <browsenode> <browsenodeid>125698031</browsenodeid> <name>vacuums</name> <ancestors> <browsenode> <browsenodeid>3147711</browsenodeid> <name>vacuums & floor care</name> <ancestors> <browsenode> <browsenodeid>3576359031</browsenodeid> <name>vacuuming, cleaning & ironing</name> <ancestors> <browsenode> <browsenodeid>391784011</browsenodeid> <name>kitchen & home appliances</name> <ancestors> <browsenode> <browsenodeid>3147411</browsenodeid> <name>categories</name> <iscategoryroot>1</iscategoryroot> <ancestors> <browsenode> <browsenodeid>11052681</browsenodeid> <name>kitchen & home</name> <ancestors> <browsenode> <browsenodeid>11052591</browsenodeid> <name>home & garden</name> <ancestors> <browsenode> <browsenodeid>3146281</browsenodeid> <name>home & garden</name> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> </ancestors> </browsenode> eot doc = nokogiri::xml(xml) here's code find nodes:
doc.search('name').map(&:text).reverse.uniq.join(' -> ') # => "home & garden -> kitchen & home -> categories -> kitchen & home appliances -> vacuuming, cleaning & ironing -> vacuums & floor care -> vacuums -> robotic vacuums" some entries duplicated, uniq clean them out.
see "how avoid joining text nodes when scraping" also.
Comments
Post a Comment