【问题标题】:Unable to get nokogiri xmlelement text value无法获取 nokogiri xmlelement 文本值
【发布时间】:2018-02-27 04:02:21
【问题描述】:

我有以下 XML 内容。

<info>
    <meta name="alias">alias1</meta>
    <meta name="score">.60</meta>
</info>
<info>
    <meta name="alias">alias2</meta>
    <meta name="score">.50</meta>
</info>

我需要为每个值取回,但这样做有困难。

doc.xpath("//info").each do |info_entry|
  info_entry.xpath("meta").each do |meta_entry|
      if meta_entry['name'] == 'alias'
          the_alias = meta_entry.xpath('text()').text
      elsif meta_entry['name'] == 'score'
          score = meta_entry.xpath('text()').text
      end
      // add struct containing alias and score to list
  end
end

但是,我没有从文本中得到任何信息。我尝试了很多不同的东西:inner_text、inner_html、内容、价值,没有任何效果。我试过 meta_entry.at、meta_entry.search 等等。

我有什么遗漏吗?任何建议将不胜感激。

【问题讨论】:

  • 您显示的 xml 在技术上是无效的,但我假设您有一些标签包裹了整个内容,例如 &lt;xml&gt;...your content...&lt;/xml&gt;
  • 它被 ... 包围,前缀为:ttp://www.w3.org/TR/REC-html40/loose.dtd" rel="nofollow" target="_blank">w3.org/TR/REC-html40/loose.dtd">

标签: ruby xpath nokogiri


【解决方案1】:

你需要摆脱xpath('text()')。您可以摆脱条件并随时构建可行的数据结构,如下所示:

def meta_contents(doc)
  doc.xpath("//info").map do |info_entry|
    info_entry.xpath("meta").map do |meta_entry|
      [meta_entry["name"], meta_entry.text]
    end.to_h
  end
end

>> meta_contents(doc)
#> [{"alias"=>"alias1", "score"=>".60"}, {"alias"=>"alias2", "score"=>".50"}]

【讨论】:

  • 有趣。你的例子奏效了。但是,当我通过 Nokogiri::HTML(open("some_url")) 提取内容并被 html 标签包围时,它对我不起作用。我得到了键,但值是空白的。
  • 嗨,我搞定了。更改为 Nokogiri::XML,成功了。感谢您的帮助!
  • @ARay 太好了。如果这对您有帮助,请点击我的答案旁边的灰色复选标记,将答案视为正确。
猜你喜欢
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多