【问题标题】:Nokogiri How can I extract text from HTML with correct spacing?Nokogiri 如何以正确的间距从 HTML 中提取文本?
【发布时间】:2012-10-10 15:21:27
【问题描述】:

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

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/中提取的一些示例文本

赛季前是纽约巨人队的防守端奥西·乌梅尼奥拉 谁说他不会用“RG3”称呼罗伯特格里芬三世而引起轰动 直到他做了什么。在那之前,是“鲍勃·格里芬”。 格里芬在华盛顿红皮队的胜利中 76 码达阵 在明尼苏达维京人队,巨人队防守端杰森 皮埃尔-保罗是对格里芬有一些看法的人。“不要 把它带到我身边,”皮埃尔 - 保罗告诉纽约媒体。“去另一个 大大地。 ……“是的,这将是一场非常好的对决。不过,不在我这边。不是 在我这边。或者另一边。”格里芬周三开玩笑地问 竞选公职,说:“我还有很多其他人要竞选 离开现在,皮埃尔 - 保罗,奥西,所有这些人。”但根据 对几个红皮队的前锋来说,格里芬不应该有太多的担心 如果他进入空旷的场地,大约是星期天。“如果罗伯特进入那个 在这种情况下,我认为没有多少人可以击败他,” 右后卫克里斯切斯特说。 “我仍然会去那里 尝试阻止并确保根本没有人接触罗伯特。但他是一个 很多优秀的运动员能够在这方面超越很多人 联赛。”在皮埃尔-保罗的 cmets 提示下,左截锋特伦特 威廉姆斯回答说:“你想让我说什么?”“罗伯特的 我的家伙。我不认识皮埃尔-保罗。我不知道他为什么会说 类似的东西,”他说。 “也许他知道一些我不知道的事情。”

【问题讨论】:

  • 不要包含指向示例文本的链接,而是包含 HTML 本身的示例。如果该链接断开,您的问题对于寻找相同问题的人的未来搜索将毫无价值。

标签: ruby html-parsing nokogiri


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    但更好的方法可能是这样的:

    text = doc.search('div.story p').map{|p| p.text}.join(" ")
    

    【讨论】:

    • 我认为第一个接近我需要的。有没有办法默认这个到每个节点,而不仅仅是 p 标签?我从数千个来源中抓取,所以我会在这个问题上找到更多的标签。
    • 你可以使用类似 'body *' 而不是 'p'
    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多