2016-04-28 132 views
0

我工作的摘要電子郵件發送給我公司的應用程序的用戶。爲此,我正在瀏覽每個用戶的電子郵件,並試圖找到關於每封電子郵件的一些基本信息(來自主題,時間戳和導致我困難的方面,圖像)。如何解析HTML編碼

我認爲引入nokogiri的search('img')功能將被罰款拉出圖像。不幸的是,它看起來像大多數電子郵件有很多垃圾嵌入在這些圖像的網址,如換行符(「\ n」),轉義字符(「\」)和字符串「3D」出於某種原因。例如:

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

這導致搜索只拉出實際的URL件/ src目錄的:

#(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\"" })] 
    }) 

任何人是否有一個想法,爲什麼這種情況正在發生,以及如何刪除這一切垃圾?

我得到像樣的成績,從大量的gsub的和安全檢查,但感覺很俗氣。

我也試過Sanitize.clean這不起作用,並且在「How to sanitize html string except image url?」中提到了PermitScrubber。

+2

正如@馬特低於所述,內容被編碼。這不是一個Nokogiri問題,它是文本被封裝和連續添加以適應舊電子郵件路由器,然後重建的結果。請注意,確定如何放鬆,然後將清理後的文本傳遞給Nokogiri。你會發現這種問題在互聯網上,從一個已經多次編碼嵌入HTML,以格式錯誤標記,並在多國語言,這將讓你着迷未編碼的多字節字符的HTML。這是在互聯網叢林中的生活。 –

+0

哈哈感謝您的解釋 – SomeSchmo

回答

3

郵件正文被編碼爲quoted printable。在使用Nokogiri解析之前,您需要解碼身體。您可以使用unpack使用Ruby這樣做很容易:

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