如何使用Nokogiri在HTML标记之前获取文本

时间:2019-06-20 04:15:30

标签: ruby-on-rails ruby nokogiri

我需要从发送给我的电子邮件中获取详细信息。我需要将每个值放入变量中,然后将其保存到数据库中,或者先将它们保存在哈希中,然后再保存到数据库中。

我正在使用Mail gem通过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 :(得分:0)

一切取决于电子邮件的原始HTML代码。如果它像您显示的那样简单,那么下面的代码应该可以工作:

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

然后,您可以通过调用to_h将其转换为哈希。

当然,请记住您的元素可能包含应过滤的其他空格。

答案 1 :(得分:0)

@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"}

移动内部元素并获取其余文本,然后与文本和内部文本组成一个元组。