【问题标题】:Parsing text and keeping raw format - Ruby/Rails解析文本并保持原始格式 - Ruby/Rails
【发布时间】:2014-10-09 15:44:10
【问题描述】:

我正在尝试解析 URL 并以原始格式返回文本。

我正在使用这个 gem:https://github.com/cantino/ruby-readability

这是我所拥有的:

require 'rubygems'
require 'readability'
require 'open-uri'

source = open(@string).read
@text = Readability::Document.new(source).content

这只是给了我用于格式化的带有 html 标记的文本。

我试过了:

@text = Readability::Document.new(source, tags: []).content

这只是去除了 html 标签的文本。所有的文字都挤在了一起。我正在尝试获取文本并保留换行符和空格,而无需任何 html 标记。然后我试图使用文本在一些额外的算法下进行处理。我没有在任何视图中显示文本。如果我要在视图中显示文本,我只需调用 simple_format 助手。

例如此网址:http://blogs.discovermagazine.com/d-brief/2014/08/01/physicist-invents-color-changing-ice-cream/

我想将文本保存为未更改的格式:

@text = %Q[信不信由你,冰淇淋可以做得更好。 Manuel Linares 曾是一名物理学家,后来成为厨师,他发明了一种经典款待的变体,当你舔它时会改变颜色。 据 Phys.org 报道,这种名为 Xamaleón 的新奶油混合物——向“变色龙”致敬——在触及舌头时会从长春花变成粉红色,尝起来类似于“tutti-frutti”。冰淇淋的多彩技巧依赖于温度的变化和对人类口腔酸的反应。然而,Linares 并没有透露更多关于他的秘方的细节。 我们所知道的是冰淇淋是用草莓、香蕉、香草和杏仁等天然成分制成的。此外,Linares 在冰淇淋被舀出后会在冰淇淋上喷洒他所谓的“爱情灵药”,以帮助加速反应。在 Linares 为他的创作获得专利之前,我们可能不会知道 Xamaleón 背后的整个故事,该专利正在申请中。 “作为一名物理学家,我知道有多种可能性可能会奏效,当我设法破解它并创造出一种会变色的冰淇淋时,我很高兴,”Linares 说。 今年早些时候,Linares 在他的西班牙家乡布拉内斯开了一家冰淇淋店,并计划在未来推出更多异国风味的冰淇淋。接下来,他说:一种由秘鲁和非洲药用植物制成的冰淇淋,具有壮阳作用。]

【问题讨论】:

  • 定义“未改变的格式”。您是指没有应用任何 CSS 或 JavaScript 更改的格式吗?或者你的意思是它在 CSS 和 JavaScript 使用它之后的样子?保持空间通常很容易。保持换行可能非常困难,因为我们在网络浏览器格式页面中看到的换行可能是换行以外的其他原因。
  • 我的意思是当您从网站复制并粘贴文本时的外观。我想这将是它在 CSS 和 JavaScript 操纵外观之后的样子。使用当前的解析器,如果您不去除 html 标记,然后将 simple_format 应用于文本,它会显示它在视图中呈现它的方式与原始文章中的完全相同。我正在尝试保存它并以与应用了 simple_format 的方式完全相同的方式对其进行处理。

标签: ruby-on-rails ruby nlp text-parsing


【解决方案1】:

最基本的,你可以试试:

require 'nokogiri'
@text = Readability::Document.new(
  Nokogiri::HTML(open('url_to_content')).text
).content

Nokogiri 是在 Ruby 中解析 XML 和 HTML 的事实标准。

Nokogiri::HTML(open('url_to_content')) 是我们解析网页 99.99% 的基础。 text 返回文档中的文本节点。

也就是说,您将不得不深入页面并仅提取包含您真正想要的文本的部分,因为该页面本身具有指向其他页面的链接,广告等等,都可以通过对根节点使用text来返回。

看起来像 'div.entry p' 这样的 CSS 选择器会让你接近:

doc.search('div.entry p').text 

返回:

doc.search('div.entry p').text “变色的味道,Xamaleon。(图片来源:Manual Linares, Cocinatis)信不信由你,让冰淇淋变得更好是可能的。前物理学家转为厨师的 Manuel Linares 发明了一种经典款待的变体, Phys.org 报道称,这种名为 Xamaleón 的新奶油混合物是对“变色龙”的致敬——当它接触到舌头时会从长春花变成粉红色,尝起来类似于“tutti-frutti”。多彩的把戏依赖于温度的变化和人类口腔对酸的反应。然而,Linares 没有透露他的秘方的更多细节。我们所知道的是冰淇淋是用草莓、香蕉等天然成分制成的,香草和杏仁。此外,Linares 在冰淇淋被舀出后会在冰淇淋上喷洒他所谓的“爱情灵药”,以帮助加速反应。在 Linares 为他的创作获得专利之前,我们可能不会知道 Xamaleón 背后的整个故事,这是笔丁。 \n“作为一名物理学家,我知道有多种可能性可能会奏效,当我设法破解它并创造出一种会变色的冰淇淋时,我很高兴,”Linares 说。 今年早些时候,Linares 在 Blanes 开了一家冰淇淋店,他的家乡在西班牙,并计划在未来推出更多异国风味的冰淇淋。接下来,他说:一种用秘鲁和非洲药用植物制成的冰淇淋,具有壮阳作用。很有趣,但我希望他经过彻底测试,以确保长期食用是安全的。如果您不透露配方,那么进行安全测试将非常困难。最后一部分,“非洲和秘鲁草药”听起来很蛇油推销员,以至于我几乎在整篇文章上称其为 BS。感谢您的专家意见!我绝对明白您的意思。他怎么敢辞掉工作,冒险进入蓬勃发展的食品行业,做出令人惊叹的东西,只是为了保守食谱的秘密,这样一些混蛋就不能偷走他的想法。真是个混蛋。是的,是的,物理学家正在摆脱所有的油腻和推销员。这家伙在卖冰淇淋。有很多天然的壮阳药。您不应该仅仅因为您不知道或不同意就判断整篇文章。如果包含任何合成成分,我对安全性测试的方向是一致的,而透明度则不是。但如果配方是纯天然的,只有其他食物中的食物成分(包括加速剂……),如红卷心菜、果糖等来模仿 Ph 纸,那就是另一回事了……看起来像红卷心菜 PH 指示剂工作中。我不认为 Linares 先生的物理学学位在“发明”这个方面发挥了作用。“爱情灵药”最好不要像听起来那样……嗯,爱情灵药,..”

打印输出看起来更好一些,并显示文本中嵌入了一些行尾:

将 doc.search('div.entry p').text 变色的味道,Xamaleon。 (图片来源:Manual Linares,Cocinatis)信不信由你,冰淇淋可以做得更好。 Manuel Linares 是一位前物理学家,后来成为厨师,他发明了一种经典款待的变体,当你舔它时会改变颜色。这种名为 Xamaleón 的新奶油混合物——向“变色龙”致敬——当它接触到舌头时,会从长春花变成粉红色, Phys.org 报告说,味道类似于“tutti-frutti”。冰淇淋的多彩技巧依赖于温度的变化和人类口腔对酸的反应。然而,Linares 并没有透露他的秘方的更多细节。我们所知道的是冰淇淋是用草莓、香蕉、香草和杏仁等天然成分制成的。此外,Linares 在冰淇淋被舀出后会在冰淇淋上喷洒他所谓的“爱情灵丹妙药”,以帮助加速反应。在 Linares 为他的创作获得专利之前,我们可能不会知道 Xamaleón 背后的整个故事,该专利正在申请中。 “作为一名物理学家,我知道有多种可能性可能会奏效,当我设法破解它并创造出一种会变色的冰淇淋时,我很高兴,”Linares 说。 今年早些时候,Linares 在 Blanes 开了一家冰淇淋店,他的在西班牙的家乡,并计划在未来推出更多异国风味的冰淇淋。接下来,他说:一种用秘鲁和非洲药用植物制成的冰淇淋,具有壮阳作用。很有趣,但我希望他经过彻底测试,以确保长期食用是安全的。如果您不透露配方,那么进行安全测试将非常困难。最后一部分,“非洲和秘鲁草药”听起来很蛇油推销员,以至于我几乎在整篇文章上称其为 BS。感谢您的专家意见!我绝对明白您的意思。他怎么敢辞掉工作,冒险进入蓬勃发展的食品行业,做出令人惊叹的东西,只是为了保守食谱的秘密,这样一些混蛋就不能偷走他的想法。真是个混蛋。是的,是的,物理学家正在摆脱所有的油腻和推销员。这家伙在卖冰淇淋。有很多天然的壮阳药。您不应该仅仅因为您不知道或不同意就判断整篇文章。如果包含任何合成成分,我对安全性测试的方向是一致的,而透明度则不是。但如果配方是纯天然的,只有其他食物中的食物成分(包括加速剂……),如红卷心菜、果糖等来模仿 Ph 纸,那就是另一回事了……看起来像红卷心菜 PH 指示剂工作中。我不认为 Linares 先生的物理学学位在“发明”这个方面发挥了作用。“爱情灵药”最好不要像听起来那样......嗯,爱情灵药,..

如果您想更好地了解所显示的文本,那么<p> 标记的尾随空行显示也必须适应,这在对代码稍作调整后很容易:

[9] (pry) main: 0> puts doc.search('div.entry p').map(&:text) 变色的味道,Xamaleon。 (来源:Manual Linares,Cocinatis) 信不信由你,冰淇淋可以做得更好。 Manuel Linares 曾是一名物理学家,后来变成了厨师,他发明了一种经典款待的变体,当你舔它时会改变颜色。 据 Phys.org 报道,这种名为 Xamaleón 的新奶油混合物是对“变色龙”的致敬——当它接触到舌头时,会从长春花变成粉红色,尝起来类似于“tutti-frutti”。冰淇淋的多彩技巧依赖于温度的变化和人类口腔对酸的反应。然而,Linares 并没有透露更多关于他的秘方的细节。 我们所知道的是冰淇淋是用草莓、香蕉、香草和杏仁等天然成分制成的。此外,Linares 在冰淇淋被舀出后会在冰淇淋上喷洒他所谓的“爱情灵丹妙药”,以帮助加速反应。在 Linares 为他的创作获得专利之前,我们可能不会知道 Xamaleón 背后的整个故事,该专利正在申请中。 “作为一名物理学家,我知道有多种可能性可能会奏效,当我设法破解它并创造出一种会变色的冰淇淋时,我很高兴,”Linares 说。 今年早些时候,Linares 在他的西班牙家乡布拉内斯开了一家冰淇淋店,并计划在未来推出更多异国风味的冰淇淋。接下来,他说:一种由秘鲁和非洲药用植物制成的冰淇淋,具有壮阳作用。 有趣,但我希望他已经过彻底测试,以确保长期食用是安全的。如果您不透露配方,那么进行安全测试将非常困难。最后一部分,“非洲和秘鲁的草药”听起来太像蛇油推销员了,我几乎在整篇文章中称其为 BS。 感谢您的专家意见! 我绝对明白你的意思。他怎么敢辞掉工作,冒险进入蓬勃发展的食品行业,做出令人惊叹的东西,只是为了保守食谱的秘密,这样一些混蛋就不能偷走他的想法。真是个混蛋。 是的,是的,物理学家正在摆脱所有的油腻和推销员。这家伙在卖冰淇淋。 有很多天然存在的壮阳药。您不应该仅仅因为您不知道或不同意而判断整篇文章。 如果包含任何合成成分,我的安全测试方向与此方向相同,而透明度则不包含。 但是,如果食谱是纯天然的,只有其他食物中的食物成分(包括加速剂……),例如红卷心菜、果糖等来模仿博士论文,那就是另一回事了…… 看起来像红卷心菜 PH 指示器在工作。我不认为 Linares 先生的物理学学位在“发明”这个方面发挥了作用。 “爱情丹药”最好不要像听起来那样…… 嗯,爱灵丹妙药,..

发生了什么:

  • doc.search('div.entry p') 返回一个 NodeSet,它类似于一个数组,包含 <p> 节点。 search 是 Nokogiri 提供的用于查找文档中所有匹配节点的几种类似方法之一。
  • map(&:text) 遍历该 NodeSet,并为每个元素返回文本,有效地返回每个段落。

【讨论】:

  • 它给了我一些奇怪的东西,它是否也与 JavaScript 混淆了?

    物理学家发明变色冰淇淋 /* */ .ZenphotoPress_left {margin-right:1em;} .ZenphotoPress_right {margin-left:1em;} .ZenphotoPress_shortcode dt {float:left; margin-right:1em;} .ZenphotoPress_shortcode hr {clear:left;可见性:隐藏;}

  • 就浏览器或解析而言,JavaScript 和 CSS 只是文本。我们必须告诉解析器忽略它们。请参阅答案中有关缩小返回文本的附加信息。
  • 谢谢!我在 doc.search('div.entry p').text 部分有点迷失了,这是在第一部分之后运行的吗?我如何将两者联系起来?如何将打印输出保存在变量/数组中(以便我可以进一步处理文本)?
  • 您需要弄清楚如何连接它。我给了你最难的部分,一旦你知道怎么做,你就会发现它并不难。
  • 不客气。像 Nokogiri 这样的工具非常有用。多年来,我每天使用它来聚合数千个 RSS、RDF 和 Atom 提要,提取它们的内容以显示给用户,挖掘 WSDL 文件以呈现 SOAP 接口的文档,找出返回 XML 的网络设备的配置,以及为网站分析和/或数据收集编写了数百个蜘蛛。
【解决方案2】:

这里有一个很长很老套的方法来获取ruby-readability 给你的东西并让它更接近你想要的东西。您需要测试它是否适用于您要抓取的其他文章。

Readability::Document.new(source, :blacklist => ".wp-caption-text", :tags => ["div","p"]).content.gsub("\n","").gsub("\r","").gsub("\t","").gsub("
","").gsub("<div>","").gsub("</div>","").strip

输出:

=> "<p>Believe it or not, it is possible to make ice cream even better. Manuel Linares, a former physicist turned cook, has invented a variant on the classic treat that changes colors as you lick it.</p><p>The new creamy concoction called Xamaleón — an homage to “chameleon” — transitions from periwinkle to pink when it touches the tongue, and tastes similar to “tutti-frutti,” Phys.org reports. The ice cream’s colorful trick relies on both changes in temperature and reactions to acids in the human mouth. However, Linares isn’t revealing any more details about his secret recipe.</p><p>What we do know is the ice cream is made with natural ingredients like strawberries, banana, vanilla and almonds. Additionally, Linares sprays what he calls a “love elixir” on the ice cream after it’s scooped to help accelerate the reaction. We probably won’t know the whole story behind Xamaleón until Linares secures a patent for his creation, which is pending. </p><p>“As a physicist I know that there are various possibilities that might work and I was delighted when I managed to crack it and create an ice cream that changes color,” Linares said.</p><p>Earlier this year Linares opened an ice cream shop in Blanes, his hometown in Spain, and has plans for more exotic ice cream flavors in the future. Up next, he says: An ice cream made with Peruvian and African medicinal plants that will provide an aphrodisiac effect.</p>

我为您保留了<p> 标签,因此您可以添加换行符或对它们做任何您想做的事情。

【讨论】:

  • 谢谢,我怎样才能让它没有任何

    标签并保持相同的原始间距和换行符?这样我就可以这样保存?

猜你喜欢
相关资源
最近更新 更多
热门标签