抓取时如何避免连接节点中的所有文本

2024-03-14

当我从 HTML 或 XML 中抓取多个相关节点来提取文本时,所有文本都会连接成一个长字符串,从而无法恢复单个文本字符串。

例如:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <p>foo</p>
    <p>bar</p>
    <p>baz</p>
  </body>
</html>
EOT

doc.search('p').text # => "foobarbaz"

但我想要的是:

["foo", "bar", "baz"]

抓取 XML 时也会发生同样的情况:

doc = Nokogiri::XML(<<EOT)
<root>
  <block>
    <entries>foo</entries>
    <entries>bar</entries>
    <entries>baz</entries>
  </block>
</root>
EOT

doc.search('entries').text # => "foobarbaz"

为什么会发生这种情况以及如何避免这种情况?


这是一个很容易解决的问题,是由于没有阅读有关如何解决的文档而导致的text用于 NodeSet 与 Node(或 Element)时的行为。

The 节点集文档 http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/NodeSet:text says text will:

获取所有包含的 Node 对象的内部文本

这就是我们所看到的情况:

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <p>foo</p>
    <p>bar</p>
    <p>baz</p>
  </body>
</html>
EOT

doc.search('p').text # => "foobarbaz"

because:

doc.search('p').class # => Nokogiri::XML::NodeSet

相反,我们想要获取每个节点并提取其文本:

doc.search('p').first.class # => Nokogiri::XML::Element
doc.search('p').first.text # => "foo"

可以使用以下方法完成map:

doc.search('p').map { |node| node.text } # => ["foo", "bar", "baz"]

Ruby 允许我们使用以下方式更简洁地编写:

doc.search('p').map(&:text) # => ["foo", "bar", "baz"]

无论我们使用 HTML 还是 XML,同样的事情都适用,因为 HTML 是 XML 的更轻松的版本。

节点有几个别名方法来获取其嵌入的文本。从文档 http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Node#content-instance_method:

#content ⇒ Object

也称为:text, inner_text

返回此节点的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抓取时如何避免连接节点中的所有文本 的相关文章

随机推荐

  • ggplot2 +facet_:某些方面的反转轴?

    我想将三个子图组合成一个图 而分面将是一种自然的方法 然而 使用反转的 x 轴 这些子图之一会更容易 更自然地阅读 而我想不理会其他子图 有没有办法使用facet grid 或facet wrap 来完成此任务 我考虑过的另一种选择是 gr
  • 如何在flutter webview中打开应用程序链接?

    在 Flutter 中 我使用 flutter网页视图插件 https pub dartlang org packages flutter webview plugin启动一个 url 例如 flutterWebviewPlugin lau
  • Sizzle 和 document.querySelectorAll 有什么区别

    据我所知 嘶嘶声和querySelector querySelectorAll是 CSS 选择器 那么 加载 Sizzle 和执行以下操作有什么区别 Sizzle my CSS query and document querySelecto
  • 我如何在 Capybara 中测试页面是否*未*重新加载(JavaScript onClick 拦截已起作用)?

    我用的是水豚 黄瓜和恶作剧 我正在测试附加到表单提交按钮的 JavaScript 函数 该函数旨在捕获提交事件并阻止它 在后台执行 AJAX 请求 使用和不使用 AJAX 页面最终看起来都是一样的 但 AJAX 方法要快得多 并且不会中断浏
  • 开始一项新活动

    我正在使用 Xamarin 我想启动一个名为 AutoLinkActivity 的新活动 这是我的代码 using System using Android App using Android Content using Android R
  • Java 示例代码示例 youtube data api v3 和授权方法作为 api 密钥

    我是 google api 的新手 为 YouTube 频道创建项目 我已经为该项目创建了 api 并生成了 api 密钥 在项目上启用 Youtube api 我到处都能获得 OAUTH 授权的代码示例 但无法找到任何用于使用 api K
  • 平衡设计原则:单元测试

    我正在编写 Bananagrams 的模拟 目前 我有一个GameMaster维护公共片段集合的类 这deal Player 方法向该玩家分发一定数量的棋子 我想为此编写单元测试 然而 此时我没有吸气剂 因此无法检查对象的状态 为什么不添加
  • “lxd”与 lxc/docker 有何不同?

    问题 lxd 如何在容器内提供完整的操作系统功能 而不仅仅是单个进程 它与 lxc docker 包装器有什么不同 是不是类似于用docker supervisor wrapper脚本启动一个容器 在一个容器中包含多个进程 换句话说 我可以
  • 使用加密密码连接到 gmail(使用 imap 和 javamail)

    我正在尝试使用一个简单的java程序连接到gmail 像这个 https harikrishnan83 wordpress com 2009 01 24 access gmail with imap using java mail api
  • 如何使用带有角度的离子框架制作apk文件

    我在本地目录中创建了简单的应用程序 该应用程序名称是 Ionic Chat master 我怎样才能把它变成apk文件 我已经使用 git 尝试了以下命令 但对我不起作用 npm install g cordova cordova buil
  • 为什么 C# 构造函数行为与 Java 不同,反之亦然?

    给定这个 Java 代码 输出0 and 4 class A A print void print System out println A class B extends A int i Math round 3 5f public st
  • 为什么只有一个核心承担全部负载,如何让其他29个核心承担负载?

    我正在尝试将 Spark 处理的数据推送到 C 的 3 节点集群 我正在向 Cassandra 推送 2 亿条记录 但它失败了 错误如下 下面是我的 Spark 集群配置 Nodes 12 vCores Total 112 Total me
  • 如何使用 CSS 或 JS 使图像变暗而不影响透明度?

    到处建议的调暗图像的正常方法是更改 其不透明度属性并在其下方显示黑色的东西 但是 我的图像具有透明度并且位于白色背景上 所以我想将背景保持在图像白色的透明部分下 只使有颜色的像素变暗 这可以在 CSS 最好 或 JS 中完成吗 编辑 示例图
  • 在单元测试期间我应该模拟哪些功能

    我一直在阅读 Stack Overflow 上的一些文章和帖子 了解何时应该模拟函数 何时不应该模拟函数 但我遇到了一个情况 我不确定该怎么做 我有一个 UserService 类 它使用依赖项注入概念通过其构造函数接收依赖项 class
  • 我应该使用 ScriptSharp

    我正在开发我的第一个 ASP NET MVC 应用程序 我相信 Script 可以帮助我很多 但它找不到支持我发展所需的资源 我找不到 Codeplex 网站 只有一本手册 很好 但还不够 我能找到的教程很少 我知道 Script 用于开发
  • 移动设备上的自动对焦文本字段,但没有键盘?

    作为我的登录和注册表单的一部分 如果出现错误 它将自动聚焦相关字段 其实 事情并不像我想象的那么简单 让我尝试解释一下 基本上 在这个项目中 页面是通过 AJAX 加载的 表格可能包括autofocus属性 这很好用 但在移动设备上它只显示
  • 禁止直接访问图像

    我正在制作一个小家庭相册 打算稍后向其他人开放以存储图像 我将图像上传到 images 然后调整它们大小 3 次 普通视图 缩略图和小版本 并将它们移动到 images thumbs images normal images tiny 然后
  • mysql 加载数据内文件更新

    我目前正在使用 mySQL LOAD DATA INFILE 将 csv 文件插入到我的数据库中 该 csv 文件每天都会下载到服务器 以保持产品数据最新 我想知道的是如何使用新的 csv 更新表并保留没有不同的现有数据 这是我目前的声明
  • scala 中的插入排序实现

    我正在尝试 Scala 我想看看如何在 scala 中实现插入排序 并满足以下要求 嵌套 for 循环 输入数组 Int 如果可能的话 通过引用方式修改函数内容的方法 否则返回 Array Int 如果这不是实现插入排序的 Scala 方法
  • 抓取时如何避免连接节点中的所有文本

    当我从 HTML 或 XML 中抓取多个相关节点来提取文本时 所有文本都会连接成一个长字符串 从而无法恢复单个文本字符串 例如 require nokogiri doc Nokogiri HTML lt