2016-04-28 12 views
0

私の会社のアプリのユーザーに送信するダイジェストメールに取り組んでいます。このために、各ユーザーの電子メールを調べ、各電子メールに関する基本情報(発信元、件名、タイムスタンプ、および難易度の高いイメージ、イメージ)を見つけようとしています。エンコードされたHTMLを解析する方法

Nokogiriのsearch('img')機能を使用すると、画像を引き出すのに問題はないと想定しました。残念ながら、ほとんどの電子メールには何らかの理由で改行(「\ n」)、エスケープ文字(「\」)、文字列「3D」などの画像のURLに多くのゴミが埋め込まれているようです。たとえば:

#(Element:0x3fd0c8e83b80 { 
    name = "img", 
    attributes = [ 
    #(Attr:0x3fd0c8e82a28 { name = "src", value = "3D%22https://=" }), 
    #(Attr:0x3fd0c8e82a14 { name = "d3ui957tjb5bqd.cloudfront.net", value = "" }), 
    #(Attr:0x3fd0c8e82a00 { name = "width", value = "3D\"223\"" }), 
    #(Attr:0x3fd0c8e829ec { name = "heigh", value = "t=3D\"84\"" }), 
    #(Attr:0x3fd0c8e829d8 { name = "alt", value = "3D\"Creative" }), 
    #(Attr:0x3fd0c8e829c4 { name = "market", value = "" }), 
    #(Attr:0x3fd0c8e829b0 { name = "border", value = "3D\"0\"" })] 
    }) 

誰もがなぜこれが起こっているのアイデアを持っていて、このすべてを削除する方法:

<img src=3D\"https://=\r\nd3ui957tjb5bqd.cloudfront.net/images/emails/1/logo.png\" 

これは、実際のURL/SRCのの部分を引き出すに検索を引き起こしていますジャンク?

私はgsubと安全性チェックがたくさんありますが、まともな結果を得ていますが、かなり気分が悪いと感じています。

私もSanitize.cleanが動作していないし、 "How to sanitize html string except image url?"に記載されているPermitScrubberを試しました。

+2

@mattが以下に述べたように、コンテンツはコード化されています。これはNokogiriの問題ではなく、テキストが折り返され、古いメールルーターに収まるように行の継続が追加され、再構築された結果です。これはあなたが気づいて、それを解く方法を決めてから、きれいになったテキストをNokogiriに渡すことです。この種の問題は、埋め込まれたHTMLが埋め込まれたHTML、ひどく書式が設定されたマークアップ、複数の言語でエンコードされたエンコードされていないマルチバイト文字など、インターネット上で発生します。それはインターネットジャングルの人生です。 –

+0

解説ありがとう – SomeSchmo

答えて

3

メール本文はquoted printableとしてエンコードされます。 Nokogiriと解析する前にボディをデコードする必要があります。あなたはunpackを使用してルビーとかなり簡単にこれを行うことができます。

decoded = encoded.unpack('M').first 

あなたが解読しようとする前に、メールのヘッダーを見て、エンコーディングが何であるかを確認する必要があり、すべてではないメールは、このようにエンコードされ、かつ、他の種類がありますエンコーディング。

1

私はこするマスターはないですが、あなたは例えばCSS属性

.at_css("img")['src'] 

を通してそれを取得することができます:

require "open-uri" 
require "nokogiri" 

doc = open(url_link) 
page = Nokogiri::HTML(doc) 

page.css("div.col-xs-12.visible-xs.visible-sm div.school-image").each do |pic| 
    img = pic.at_css("img")['src'].downcase if pic.at_css("img") 
end 
関連する問題