我需要从发送给我的电子邮件中获取详细信息。我需要将每个值放入变量中,然后将其保存到数据库中,或者先将它们保存在哈希中,然后再保存到数据库中。
我正在使用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>
答案 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"}
移动内部元素并获取其余文本,然后与文本和内部文本组成一个元组。