如何解析编码的HTML

时间:2016-04-28 18:54:17

标签: html ruby-on-rails ruby email nokogiri

我正在制作摘要电子邮件,以便发送给我公司应用的用户。为此,我将浏览每个用户的电子邮件,并尝试查找有关每封电子邮件的一些基本信息(来自,主题,时间戳,以及导致我困难的方面,图像)。

我认为Nokogiri的search('img')功能可以用来提取图像。不幸的是,看起来大多数电子邮件都会在这些图像的URL中嵌入大量垃圾,例如换行符(“\ 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 个答案:

答案 0 :(得分:3)

邮件正文编码为quoted printable。在使用Nokogiri解析之前,您需要对身体进行解码。使用unpack

,可以使用Ruby轻松完成此操作
decoded = encoded.unpack('M').first

您应该在尝试解码之前查看邮件标题来检查编码是什么,并非所有邮件都以这种方式编码,还有其他类型的编码。

答案 1 :(得分: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