Как извлечь текст перед тегом HTML с помощью Nokogiri - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно узнать подробности из письма, которое мне отправлено. Мне нужно поместить каждое значение в переменную и сохранить его в базе данных или сохранить его в хеш-файле перед сохранением в базе данных.

Я использую самоцвет Mail для получения электронной почты с помощью POP3, а Nokogiri - для анализа электронной почты. Данные, которые мне нужно получить, находятся внутри тега <span>. Однако мне также нужно получить текст перед тегом <span>, который будет служить ключом для текста внутри тега. Например, Name: <span> My Name </span>.

Ожидаемый результат должен быть таким, если он сохранен в хэше:

hash = ['Tour Name:' : 'Day Tour', 'Tour Date:' : '2019-06-07']

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

Вот мой код:

require 'net/imap'
require 'nokogiri'

class SomeClass

    def self.get_email
        Mail.defaults do
          retriever_method :pop3, :address    => "pop.gmail.com",
                                  :port       => 995,
                                  :user_name  => username,
                                  :password   => password,
                                  :enable_ssl => true
        end

        email = Mail.first.html_part.to_s
        doc = Nokogiri::HTML::Document.parse(email)
        puts doc.css('span').map(&:text) <- gets text of span only
    end
end

Необработанный HTML-код электронного письма:

 <tr>
  <td>
  Tour Name: <span style="font-weight:bold">Day Tour</span>
 </td>
</tr>
<tr>
  <td>
  Tour Date: <span style="font-weight:bold">June 07, 2019</span>
  </td>
</tr>

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Ответ @MrShemek подходит для вашего HTML. Если у вас больше иерархии узлов внутри ваших внутренних дочерних элементов, вы можете сделать:

Nokogiri::HTML(email).css('td').map{|t| r=t.css('span').remove; [t.text, r.text].map(&:strip)}.to_h
=> {"Tour Name:"=>"Day Tour", "Tour Date:"=>"June 07, 2019"}

Внутренний элемент перемещается, а оставшийся текст извлекается, затем формируется кортеж с текстом и внутренним текстом.

0 голосов
/ 20 июня 2019

Все зависит от необработанного HTML-кода электронной почты. Если все так просто, как вы показали, то следующий код должен работать:

docs.css('td').map{|td| td.children.map(&:text)}

Затем вы можете преобразовать его в хеш, вызвав to_h.

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

...