2

我正在尝试提取文档的文本以对其进行索引以进行搜索。除了各种单词和标点符号一起运行之外,以下主要工作。当它删除标签时,我需要用空格替换它们,所以我不会遇到这个问题。我一直在试图找出最有效的方法来做到这一点,但到目前为止我还是一无所获。

doc = Nokogiri::HTML(html)
doc.xpath("//script").remove
doc.xpath("//style").remove
doc.xpath("//a").remove
text = doc.text.gsub(/\s+/,' ')

这是我从http://www.washingtontimes.com/blog/redskins-watch/2012/oct/18/redskins-linemen-respond-jason-pierre-paul-rg3-com/中提取的一些示例文本

赛季前,纽约巨人队的防守端锋奥西·乌梅尼奥拉(Osi Umenyiora)说他不会用“RG3”称呼罗伯特·格里芬三世,直到他有所行动。在那之前,是“鲍勃·格里芬”。在华盛顿红皮队战胜明尼苏达维京队的比赛中,格里芬的 76 码达阵得分后,巨人队防守端锋杰森·皮埃尔-保罗对格里芬发表了一些评论。“不要把它带到我身边,”皮埃尔 - 保罗告诉纽约媒体。“走另一条路。......“是的,这将是一场非常好的对决。不过,不在我这边。不在我这边。或者另一边”格里芬周三开玩笑地问到竞选公职的问题,他说:“我现在还有很多其他人要逃跑,皮埃尔-保罗、奥西,所有这些人。”但据红皮队的几名前锋说,格里芬不应该 周日如果他进入空场就不用担心太多。“如果罗伯特进入那种情况,我认为没有多少人可以击倒他,”右后卫克里斯切斯特说。“我仍然会去那里尝试阻止并确保根本没有人接触罗伯特。但他是一个非常优秀的运动员,能够在这个联盟中超越很多人。” 皮埃尔-保罗的评论提示,左截锋特伦特威廉姆斯回答说:“你想让我说什么?” “罗伯特是我的人。我不认识皮埃尔-保罗。我不知道他为什么会说这样的话,”他说。“也许他知道一些我不知道的事情。”</p> ”右后卫克里斯切斯特说。“我仍然会去那里尝试阻止并确保根本没有人接触罗伯特。但他是一个非常优秀的运动员,能够在这个联盟中超越很多人。” 皮埃尔-保罗的评论提示,左截锋特伦特威廉姆斯回答说:“你想让我说什么?” “罗伯特是我的人。我不认识皮埃尔-保罗。我不知道他为什么会说这样的话,”他说。“也许他知道一些我不知道的事情。”</p> ”右后卫克里斯切斯特说。“我仍然会去那里尝试阻止并确保根本没有人接触罗伯特。但他是一个非常优秀的运动员,能够在这个联盟中超越很多人。” 皮埃尔-保罗的评论提示,左截锋特伦特威廉姆斯回答说:“你想让我说什么?” “罗伯特是我的人。我不认识皮埃尔-保罗。我不知道他为什么会说这样的话,”他说。“也许他知道一些我不知道的事情。”</p> “你想让我说什么?” “罗伯特是我的人。我不认识皮埃尔-保罗。我不知道他为什么会说这样的话,”他说。“也许他知道一些我不知道的事情。”</p> “你想让我说什么?” “罗伯特是我的人。我不认识皮埃尔-保罗。我不知道他为什么会说这样的话,”他说。“也许他知道一些我不知道的事情。”</p>

4

2 回答 2

0

其他答案是讨论在文档中插入空格,但如果(如问题所问)您的要求是用空格替换这些节点,Nokogiri 有一个替换方法。所以要用空格替换脚本标签:

doc.xpath('//script').each do |node|
  node.replace(' ') 
end

该问题还询问“正确”间距。大多数浏览器在标签周围渲染时不会插入空格<script>,因此虽然对文本提取很有用,但这不一定是“正确”的事情。

于 2014-10-09T11:20:44.603 回答
-1

您可以尝试在每个 p 标签之前插入一个空格:

doc.search('p').each{|el| el.before ' '}

但更好的方法可能是:

text = doc.search('div.story p').map{|p| p.text}.join(" ")
于 2012-10-20T02:04:26.623 回答