Очистка вложенного пролета Нокогири

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

Любая помощь будет принята с благодарностью:

menu = doc.css('.menu-index-page__item-content').map do |menu|

  meal_name                   = menu.at_css('.menu-index-page__item-title span[1]').text.strip
  meal_price                  = menu.at_css('.menu-index-page__item-price').text.strip
  meal_des                  = menu.css('p.menu-index-page__item-desc span[3]').text.strip.to_s

Event1.new food_name, food_price, food_des конец меню pp

возвращается

#<struct Event1
  meal_name = "chicken Burger",
  meal_price = "£3.95",
  meal_des = "">,

HTML-код, который я пытаюсь очистить, находится ниже:

<div class = "menu-index-page__item-content" data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent">

<h6 class = "menu-index-page__item-title" data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.0"><span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.0.1">Chicken Burger</span></h6>
<p class = "menu-index-page__item-desc" data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1"><span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0">
<span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0"><span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0"><span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0.0:$0">Chargrilled chicken thigh with</span>
<br data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0.0:$0br"><span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0.$1">fresh herb olive oil mayonnaise.</span></span>
<span style = "position:fixed;visibility:hidden;top:0;left:0;" data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.2">…</span></span></p>
<span class = "menu-index-page__item-price" data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.2">£3.55</span>

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

как описание, я не уверен, почему span [3] не дает мне никаких результатов.

В вставленном HTML-коде есть обрезанное содержимое. Что это такое? Смотрите это: "$menuItemContent.1.0.2">…</span></span></p>"

Jagdeep Singh 05.07.2018 13:44

Вы хотите посмотреть на источник большого объекта json, который инициализируется с помощью.

pguardiario 06.07.2018 04:28
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
2
169
2

Ответы 2

С небольшим знанием nokogiri я не знаю, как лучше это сделать, но вот как я извлек текст из данного HTML:

# I assume you can get this HTML by doing `menu.css('p.menu-index-page__item-desc').something`
desc_html = '<span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0">
               <span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0">
                 <span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0">
                   <span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0.0:$0">Chargrilled chicken thigh with</span>
                   <br data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0.0:$0br">
                   <span data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.0.$1">fresh herb olive oil mayonnaise.</span>
                 </span>
                 <span style = "position:fixed;visibility:hidden;top:0;left:0;" data-reactid = ".1446l8bfnk0.3.5.0.4:$648324.2.$4885079.$menuItemContent.1.0.2"></span>
               </span>
             </span>'

doc = Nokogiri.parse(desc_html)

doc.children.text
 => "\n  \n    \n      Chargrilled chicken thigh with\n      \n      fresh herb olive oil mayonnaise.\n    \n    \n    \n  \n"

doc.children.text.strip
 => "Chargrilled chicken thigh with\n      \n      fresh herb olive oil mayonnaise."

doc.children.text.strip.gsub(/\W{2,}/, ' ')
 => "Chargrilled chicken thigh with fresh herb olive oil mayonnaise."

Спасибо за ответ, я должен был быть более ясным, html - это всего лишь фрагмент всей html-страницы, html, который я предоставил, - это раздел страницы, которая мне интересна. Когда я пытаюсь 'doc.children.text 'if дает мне все дочерние элементы для всей страницы.

Joseph Kouroma 05.07.2018 15:54

В моем ответе doc представляет не всю страницу, а только раздел описания.

Jagdeep Singh 05.07.2018 15:56

Чтобы быть более ясным, попробуйте doc = menu.css('p.menu-index-page__item-desc') или что-то, что вернет элемент Nokogiri для раздела описания.

Jagdeep Singh 05.07.2018 15:58

Это работает для меня:

# ...
menu = doc.css('.menu-index-page__item-content')
menu.map { |m| m.css('span')[2].text  }
# => ["Chargrilled chicken thigh with\nfresh herb olive oil mayonnaise.\n…"]

Другие вопросы по теме