我有一个Wordpress博客的XML文件,其中包含引号:

<item>
  <title>Brothers Karamazov</title>
  <content:encoded><![CDATA["I think that if the Devil doesn't exist and, consequently, man has created him, he has created him in his own image and likeness."]]></content:encoded>
  <category domain="post_tag" nicename="dostoyevsky"><![CDATA[Dostoyevsky]]></category>
  <category domain="post_tag" nicename="humanity"><![CDATA[humanity]]></category>
  <category domain="category" nicename="quotes"><![CDATA[quotes]]></category>
  <category domain="post_tag" nicename="the-devil"><![CDATA[the Devil]]></category>
</item>

我想要提取的东西是标题,作者,内容和标签。 到目前为止,这是我的代码:

require "rubygems"
require "nokogiri"

doc = Nokogiri::XML(File.open("/Users/charliekim/Downloads/quotesfromtheunderground.wordpress.2013-04-14.xml"))

doc.css("item").each do |item|
  title   = item.at_css("title").text
  tag     = item.at_xpath("category").text
  content = item.at_xpath("content:encoded").text

  #each post will later be pushed to an array, but I'm not worried about that yet, so for now....
  puts "#{title} #{tag}"
end  

我很难从每个item获取所有标签。 我得到的回报就像Brothers Karamazov Dostoyevsky 我并不担心它是如何格式化的,因为它只是一个测试,看它是正确的选择。 谁知道我怎么能这样做?

我也想制作大写的标签=作者,所以如果你知道怎么做,它也会有所帮助,虽然我还没有尝试过。


编辑:我将代码更改为:

doc.css("item").each do |item|
  title   = item.at_css("title").text
  content = item.at_xpath("content:encoded").text
  tag     = item.at_xpath("category").each do |category|
        category
  end

  puts "#{title}: #{tag}"
end

返回:

Brothers Karamazov: [#<Nokogiri::XML::Attr:0x80878518 name="domain" value="post_tag">,     #<Nokogiri::XML::Attr:0x80878504 name="nicename" value="dostoyevsky">]

而且似乎更容易管理。 它搞砸了我从大写标签中获取作者的计划,但是,这并不是一笔交易。 我怎么能拉第二个value

===============>>#1 票数:2 已采纳

at_方法只返回第一个结果时,你正在使用at_xpath并期望它返回多个结果。

你想要的东西:

tags = item.xpath("category").map(&:text)

这将返回一个数组。

至于识别作者,您可以使用正则表达式来选择以大写字母开头的项目:

author = tags.select{|w| w =~ /^[A-Z]/}

哪个会选择任何大写的标签。 这使得标签保持不变。 如果您希望将作者与标记分开,则可以使用partition

author, tags = item.xpath("category").map(&:text).partition{|w| w =~ /^[A-Z]/} 

请注意,在上面的示例中,author是一个数组,将包含所有匹配的项(即多个大写标记)。

  ask by dax translate from so

未解决问题?本站智能推荐:

4回复

使用Nokogiri解析大型XML

因此,我尝试使用Nokogiri解析一个超过40万行的XML文件。 XML文件具有以下基本格式: 这是我创建的用于解析并将每个DisorderSign ID和名称返回到数据库的代码: 这对我使用的测试文件非常有效,尽管它们很小,大约10000行。 当我尝试在大型XML
1回复

使用Nokogiri解析XML文件?

如何获取所有categories和subcategories数据? 我正在尝试这样的事情: 但这给了我:
2回复

使用Nokogiri和regex解析Ruby XML文档中的编码标签

我正在尝试使用嵌入在标签中的标签来解析XML,例如使用Nokigiri和Ruby这样的标签: 在这种情况下,我只需要单词“ Trennmesser”,而不需要嵌入标签中。 在第二个示例中: 封闭的/ph和开放ph标记中的单词也很有趣,因此正则表达式需要提取字符串“ Hilf
1回复

使用Ruby和Nokogiri解析XML

我具有以下XML结构: 我可以使用Ruby和Nokogiri来获取name节点的文本内容: 但是,我想要的是按name在源文档中显示的顺序的所有name和alias节点的文本内容。 我尝试的一切都失败了。 有没有人有一个很好的例子,如何做到这一点?
1回复

Ruby-使用Nokogiri解析XML

我对XML并不熟悉,并试图使网络自动化有所发展。 我得到一些类似以下的XML响应,并尝试将其转换为哈希或易于使用的某种东西。 我不知道我做错了什么。 我得到如下所示的输出。 任何人都可以将我推向一个方向吗? 我尝试了nokogiri文档和指南,但是有点迷茫。 我的资料:
1回复

如何使用Nokogiri解析返回的XML

我试图用nokogirl解析此XML,但是遇到了麻烦。 有什么想法我要去哪里吗? 我想得到每个经销商,并获取它们各自的价值。 返回的XML: 以前我有这样的回应: 使用nokogiri很容易解析: 我想做类似的事情:
2回复

使用Nokogiri将XML解析为CSV

我试图弄清楚如何从URL返回的XML中获取Make和Model并将其放入CSV。 这是从URL返回的XML: 这是我到目前为止的代码: 出于某种原因,URL两次返回相同的数据,但我只需要第一个结果。 到目前为止,我尝试从XML中获取Make and Model的尝试失败了……
2回复

Nokogiri可以搜索“?xml-stylesheet”标签吗?

我需要解析XML样式表: 使用Nokogiri我试过: 但我得到错误:
3回复

使用Nokogiri SAX解析器解析XML文件

我已经读了一些书,并且一直在尝试从一个大型XML文件中获取某些数据。 数据如下所示: 我想编写start_element ,将所有这些添加到一个记录数组中,例如: 使用类似: 如何更新代码以将其他标签添加到阵列?
1回复

使用Nokogiri解析XML,但无法解析名称空间

我有一条XML消息,并且我的脚本需要能够解析“ AccountStatus”节点元素。 如果发布的XML没有名称空间,我的脚本可以正常工作。 当我包含原始名称空间时,脚本执行Nokogiri::XML(request.body.read)时会丢失大量XML数据。 这是XML示例: