如何在 Nokogiri 中收集节点的几个元素中的第一个

2024-01-29

我的数据看起来像:

<release> 
 <artists>
  <artist>
   <name>Johnny Mnemonic</name>
  </artist>
  <artist>
    <name>Constantine</name>
  </artist>
 <artists>
</release>
<release>
 <artists>
  <artist>
   <name>Speed</name>
  </artist>
  <artist>
    <name>The Matrix</name>
  </artist>
 <artists>
 </release>
 ...and so on.

对于每个版本,我只想要第一个版本的数据<artist>标签。我尝试了以下代码,但它从艺术家那里提取了所有文本:

page = Nokogiri::XML(open("37.xml"))

page.xpath("//artists[1]").each do |el|

File.open("#{LOCAL_DIR}/37.txt", 'a'){|f| f.write(el)}

Nokogiri 支持两种主要类型的搜索,search and at. search返回一个 NodeSet,您应该将其视为一个数组。at返回一个节点。两者都可以采用 CSS 或 XPath 表达式。我更喜欢 CSS,因为它们更具可读性,但有时您无法轻松地使用其中一种来达到您想要的效果,因此请尝试另一种。

对于您的问题,重要的是使用指定要从中提取文本的节点text。如果您的结果太宽泛,除了您想要的标签内的文本之外,您还会从标签之间获取文本。为了避免深入到您要阅读的内容的最直接节点:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<release> 
<artists>
  <artist>
  <name>Johnny Mnemonic</name>
  </artist>
  <artist>
    <name>Constantine</name>
  </artist>
<artists>
<release>
EOT

因为这些寻找name具体来说,所需的文本很容易获得,没有垃圾:

doc.at('name').text                # => "Johnny Mnemonic"
doc.at('artist name').text         # => "Johnny Mnemonic"
doc.at('artists artist name').text # => "Johnny Mnemonic"

这些是较宽松的搜索,因此会返回更多垃圾:

doc.at('artist').text  # => "\n   Johnny Mnemonic\n  "
doc.at('artists').text # => "\n  \n   Johnny Mnemonic\n  \n  \n    Constantine\n  \n \n\n"

Using search返回多个节点:

doc.search('name').map(&:text)

[
    [0] "Johnny Mnemonic",
    [1] "Constantine"
]

doc.search('artist').map(&:text)

[
    [0] "\n   Johnny Mnemonic\n  ",
    [1] "\n    Constantine\n  "
]

之间唯一真正的区别search and at就是它at就好像search(...).first.

See "抓取时如何避免连接节点中的所有文本 https://stackoverflow.com/questions/43594656/how-to-avoid-joining-all-text-from-nodes-when-scraping" also.

为了方便起见,Nokogiri 有一些额外的别名:at_css and css, and at_xpath and xpath.


以下是替代方法,使用 CSS 和 XPath 访问器来获取从 Pry 中剪辑的名称:

[5] (pry) main: 0> # using CSS with Ruby
[6] (pry) main: 0> artists = doc.search('release').map{ |release| release.at('artist').text.strip }
[
    [0] "Johnny Mnemonic",
    [1] "Speed"
]
[7] (pry) main: 0> # using CSS with less Ruby
[8] (pry) main: 0> artists = doc.search('release artists artist:nth-child(1) name').map{ |n| n.text }
[
    [0] "Johnny Mnemonic",
    [1] "Speed"
]
[9] (pry) main: 0>
[10] (pry) main: 0> # using XPath
[11] (pry) main: 0> artists = doc.search('release/artists/artist[1]/name').map{ |t| t.content }
[
    [0] "Johnny Mnemonic",
    [1] "Speed"
]
[12] (pry) main: 0> # using more XPath
[13] (pry) main: 0> artists = doc.search('release/artists/artist[1]/name/text()').map{ |t| t.content }
[
    [0] "Johnny Mnemonic",
    [1] "Speed"
]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Nokogiri 中收集节点的几个元素中的第一个 的相关文章

随机推荐

  • 安装后无法使用指南针

    我似乎无法在 Vagrant 上使用指南针这个 Vagrant 文件 https github com Ilyes512 Vaprobash blob compass Vagrantfile 请在此处查看 bash 脚本的其余部分 已删除存
  • 设置 Git GUI 差异窗口的 UTF-8 显示

    我不记得我是如何让 Git GUI 正确显示 UTF 8 编码差异的 而且我在搜索引擎中找不到该指南 现在我需要在新的工作场所这样做 你能写下说明吗 操作系统 Windows 7 Global setting for all you rep
  • 如何在 Chrome 扩展中实现日志记录功能

    我正在开发一个扩展 并且需要日志记录 不是基于控制台的日志记录 而是传统意义上的日志文件 扩展程序监视某些事件并将它们记录到文件系统 首先 我尝试了文件系统 API 调用 一般来说 这似乎是正确的 API 但问题是我需要向我的扩展的用户提供
  • iOS8中UIImagePickerController隐藏状态栏问题

    我做了这个 void navigationController UINavigationController navigationController willShowViewController UIViewController view
  • StreamBuilder 中具有初始值的 TextField

    我们正在创建一个用户的编辑数据页面 因此文本字段已经填充了用户数据 用户可以更改并保存它 问题是 当我开始在文本字段中输入字符时 光标会丢失 每个字符都会丢失我输入 从设备键盘 光标转到第一个字符 如果我使用初始值删除控制器 它工作正常 但
  • Ionic 3项目和插件人行横道错误

    我有一个 Ionic 3 项目 当我运行 ionic cordova run android prod 时 我看到 这个错误 ANDROID HOME C Users asus AppData Local Android sdk JAVA
  • 电子邮件集成

    我想知道是否有人可以帮助我 在某些网络应用程序中 应用程序会发送电子邮件 例如发布新消息时 然后 您无需登录应用程序来发布回复 只需回复电子邮件即可 它会自动使用您的回复更新网络应用程序 我的问题是 这是如何完成的以及它叫什么 Thanks
  • .NET Core 2.0 中的 HttpWebRequest 抛出 302 Found 异常

    我们正在将应用程序从 net Framework 升级到 net core 2 0 在其中 我们使用一个HttpWebRequest联系网站AllowAutoRedirect设置为假 当代码执行时request GetResponse 该网
  • 如何在 Linux x86 NASM 中打印字符?

    我正在尝试使用打印单个字符或数字NASM 针对 x86 GNU Linux 架构 这是我正在使用的代码 section text global start start Linux printing preparation mov eax 4
  • 使用 sos.dll 调试 .net 应用程序时,为什么局部变量和参数在堆栈帧上不显示任何数据?

    我的 net 4 asp net 应用程序正在处理请求 但请求超时 因此我获取转储并尝试在线调试实时应用程序 修订版 仅分析转储文件 而不附加到应用程序的实时进程 我发现一个线程消耗请求花费1分5秒 我浏览该线程的堆栈 我想尝试找出参数和局
  • 无法使用 Python 填充 WPF DataGrid

    我在使用 Python NET 将数据绑定到 WPF DataGrid 时遇到问题 代码如下所示 我尝试了三种不同的方法来绑定数据 每种方法都失败 并且错误消息作为注释包含在下面的代码中 如果我不尝试添加数据 则 datagarid 会正确
  • 从 HDFS 中 Unpickle 文件

    我目前正在使用 Python 3 并且想从 HDFS 加载 pickle 文件 from pywebhdfs webhdfs import PyWebHdfsClient import pickle hdfs PyWebHdfsClient
  • Makefile.am:如何在configure.ac中使用curl-config和xml2-config?

    我想在configure ac 中给定现有Makefile 如下 设置包含和lib 路径 但我不知道如何在configure ac中使用 shell XYZ config libs 命令 有人可以帮忙吗 谢谢 Acquire configu
  • 更新到 MacOS Catalina 后无法使用 PHPIZE

    这就是生活 新的 MacO 升级 新问题 就像发生在莫哈韦沙漠一样 更新到 MacOS Mojave 后无法使用 PHPIZE https stackoverflow com questions 52592548 unable to use
  • 从 Spring 初始化中删除 JNDI

    我正在 maven tomcat 插件中加载 Spring 应用程序 我没有使用Spring引导 加载时 我收到无法加载 JNDI 属性的调试日志 例如 localhost startStop 1 DEBUG org springframe
  • WWW 与非 WWW——最佳实践是什么?我需要为我的新 SSL 证书选择一个 [已关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的网站应该是 www 地址还是非 www 地址 这是一个非常基本的问题 我想看看人们认为这里的最佳实践是什么 我必须选择的原因是我需要为其中之一购买
  • 没有为此事件记录任何 HTTP 请求

    我在 VB NET 应用程序中使用最新的 Twilio NET SDK 5 0 2 我正在通过 REST 客户端发起一条消息 该消息使用消息服务发送 在消息服务中我有 http dev leadtraxsolutions com Servi
  • 如何使用事件处理 Rails 应用程序中的时区

    我有一个用于乐队的 Rails 应用程序 乐队可以导入在不同时区进行的表演 将这些事件存储在 UTC 中似乎需要做大量工作 我必须弄清楚创建的任何节目的时区 然后在向用户显示时转换回节目的本地时区 有没有一个简单的插件可以根据地理位置获取
  • 嵌套迭代列表,然后最终删除

    我正在尝试迭代一个列表 同时已经循环它 嵌套循环 考虑下面的代码 ArrayList
  • 如何在 Nokogiri 中收集节点的几个元素中的第一个

    我的数据看起来像